2

プロトタイプについて読んだことから、コンストラクター関数のプロトタイプに対する変更は、そのコンストラクター関数を使用して作成されたすべてのオブジェクトに反映されるという印象を受けました。

次のコードを検討してください。

var Class1 = function(){
    this.prop1 = 'value1';
};
Class1.prototype.prop2 = 'value2';

var Class2 = function(){
    this.prop3 = 'value3';
};

//Class2.prototype = new Class1(); //1*
var obj1 = new Class2();
Class2.prototype = new Class1(); //2*

console.log('1 ' + obj1.prop1); // undefined
console.log('2 ' + obj1.prop2); // undefined
console.log('3 ' + obj1.prop3); // value3

ご覧のとおり、obj1 を構築した後で Class1 プロトタイプを Class2 に割り当てたため、prop1 と prop2 の値は「未定義」を返しています。
1* のコメントを外し、2* をコメントアウトすると、期待どおりの結果が得られます。

ここ数日、プロトタイプについてかなりの量の記事を読んできましたが、順序が重要であるとは誰も言いませんでした。

4

1 に答える 1

1

もちろん、順序は重要です。なぜなら、newキーボードは ECMAscript に、任意の親オブジェクトにバインドされObjectた新しく新しく作成されたものを返すように強制するからです。prototypeそのため、「クラス」オブジェクトのインスタンスを 2 番目に作成すると (クラスという用語は、ECMAscript ではまったく意味がありません)、エンジンはプロトタイプ チェーンを認識している必要があります。

于 2012-04-27T09:57:07.737 に答える