2 つの問題があります。
まず、関数名として使用することはできませんextends
(strict モードを使用し、strict モードをサポートする環境でのみコードを実行する場合を除く)。Loose モードの予約語です。(現在は使用されておらず、使用される可能性も低いですが、予約されています。)
2 番目の、より重要な点は、どこにも呼び出し Parent
を行っていないため、当然、そのプロパティがオブジェクトに追加されていないことです。設定したものを取得するには内部から呼び出す必要があり、 への呼び出しParent
内で正しいChild
ように実行する必要があります。を介してそれを行うことができます。これにより、何をすべきかを指定する関数を呼び出すことができます(この場合、 への呼び出し内と同じにしたい):this
Parent
Function#call
this
this
Child
function Child (){
Parent.call(this);
}
したがって、合計で、間違った (しかし無害な) セミコロンが削除され、extends
予約されていないものに変更され、インデントが一貫したものになると、次のようになります。
ライブコピー| ライブソース
function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
function Parent (){
this.cardArray=[];
}
function Child (){
Parent.call(this);
}
extend(Child, Parent);
var a = new Child();
console.log("typeof a.cardArray = " + typeof a.cardArray);
...これは正しい「typeof a.cardArray = object」を示しています。
本当に効果的な JavaScript の継承には、(今のところ) かなりの配管が必要であることに注意してください。そこにはたくさんありますが、すべてではありません。(たとえば、親メソッドの呼び出しは厄介です。) 私は、FWIW さんのためにすべての配管を行うという非常に小さなライブラリを作成しました。Lineage