2016-12-19 10 views
0

オンラインソースからプロトタイプの継承について説明するこの修正されたビットのコードがあります。Javascriptでのプロトタイプ継承の使用

var myObj = function() {}; // start w a regular func 

myObj.prototype.a = 1; // attach properties to property 
myObj.prototype.b = 2; 

console.log('myObj dir a is: ' + myObj.a); // undefined 

var myRealObj = new myObj(); 
console.log('my real obj a is: ' + myRealObj.a); // works 

私の混乱のビットは、aが未定義の最初のログステートメントです。関数の上のプロトタイプチェーン内にあってもチェーンを歩かないといけませんか?オブジェクトを作成するためにnewを使用すると、なぜ動作しますか?

ありがとうございます!

+0

ですが期待していますか?彼らはそうではありません。プロトタイプは、コンストラクタ関数ではなく、インスタンスではこのように機能します。 – Xufox

+0

コンストラクタの '.prototype'プロパティとプロトタイプチェーンを混同しないでください。 – Bergi

答えて

0

myObj.prototypeは、newキーワードが使用されている場合にのみ、インスタンスのプロトタイプチェーンの一部として設定されます。 newキーワードが使用されていない場合は、プロトタイプのチェーン関係はありません。 newキーワードが使用されている場合

は、次のようなコードを想像することができますコンストラクタ関数へ「を注入」されています

var myObj = function() { 
    var this = Object.create(myObj.prototype); // which creates an empty object 
           // with myObj.prototype on its prototype chain 

    // your code here... 

    return this; 
}; 
+0

これは 'myRealObj'のプロトタイプチェーンの一部として設定され、' myObj'のものではありません – Bergi

1

あなたの混乱が「コンストラクタ関数」とオブジェクトの区別から茎newキーワードが使用されたときにその関数(インスタンス)から作成された関数です。

コンソールに書き込むためにあなたの最初の試みで、あなたが実際にコンストラクタ関数を呼び出していない:

// The "a" property won't exist because "myObj" isn't being invoked 
console.log('myObj dir a is: ' + myObj.a); 

機能は括弧とコンストラクタ関数で呼び出す必要がありますも取得するためにnewで呼び出されなければなりませんa newオブジェクトが作成されました。

したがって、最初にオブジェクトインスタンスを受信して​​いないので、undefinedが返されます。しかし、prototypeオブジェクトは、あなたが書かれていたそうだとすれば、その時点で存在する:

console.log('myObj dir a is: ' + myObj.prototype.a); 

あなたは、プロパティの値を得ているでしょう。

2回目の試みでは、コンストラクタ関数を使用してオブジェクトインスタンスを作成しました。この新しいインスタンスは指定されたプロトタイプから継承され、プロトタイプのプロパティーはabになります。

この呼び出しによって、作成された新しいインスタンスへの参照が暗黙的に返され、myRealObj変数でその参照をキャプチャしています。

0

多少混乱しても、myObj.prototypeはmyObjのプロトタイプではなく、myObjをコンストラクタ関数として使用して作成された新しいオブジェクトが持つプロトタイプです。

は、なぜあなたは `myObj.prototype.a`は` myObj.a`と同じものであることをこのmyobjのプロトタイプがmyObj.__proto__

関連する問題