1

以下に示すいくつかのJavaScriptコードがあります

function extends(Child, Parent) {
    var F = function() {
    };
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

function Parent() {
    this.cardArray = [];
}

function Child() {

}

それから私は電話します

extends(Child , Parent);  
var a=new Child();

それは報告します

 a.cardArray is undefined

あなたのコメント歓迎

4

1 に答える 1

3

2 つの問題があります。

まず、関数名として使用することはできませんextends(strict モードを使用し、strict モードをサポートする環境でのみコードを実行する場合を除く)。Loose モードの予約語です。(現在は使用されておらず、使用される可能性も低いですが、予約されています。)

2 番目の、より重要な点は、どこにも呼び出し Parentを行っていないため、当然、そのプロパティがオブジェクトに追加されていないことです。設定したものを取得するには内部から呼び出す必要があり、 への呼び出しParent内で正しいChildように実行する必要があります。を介してそれを行うことができます。これにより、何をすべきかを指定する関数を呼び出すことができます(この場合、 への呼び出し内と同じにしたい):thisParentFunction#callthisthisChild

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

于 2013-05-26T09:25:43.110 に答える