2016-04-27 20 views
1

誰かがこの動作を私に説明できますか?コンストラクタでの奇妙な振る舞い

まず者は、コンストラクタを使用して、コンストラクタ、新しいオブジェクトを作成してみましょう:予想通り

var MyConstructor = function() {}; 
var obj = new MyConstructor(); 

すべてがある:

console.log(obj.constructor === MyConstructor); //true 
console.log(obj.__proto__ === MyConstructor.prototype); //true 

のは、もう一度試してみようが、今回は、のがにカスタムプロトタイプを追加してみましょうコンストラクタ:

var MyConstructor2 = function() {}; 
var myProto = { fld: 'val' }; 
MyConstructor2.prototype = myProto; 
var obj2 = new MyConstructor2(); 

ここでは、私が期待しているものではありません:

console.log(obj2.constructor === MyConstructor2); //false?!?! 
console.log(obj2.constructor === Object); //true, b-but i didnt use Object.. 
console.log(obj2.__proto__ === MyConstructor2.prototype); //true 

なぜobj2.constructorObjectなくMyConstructor2を参照していますか?

--- edit1 ---

ちょうど明確にする。あなたは新しい関数を作成した場合:ここで注意すべき事はということです

MyConstructor.prototype = temp; 

var MyConstructor = function() {}; 

をその後、Javascriptの実装は、新しいオブジェクトを作成します:

var temp = { constructor: MyConstructor }; 

をし、それを設定しますtempオブジェクトはフィールドをObject.prototype(デフォルトではObject.prototype.constructor === Object)から上書きします。

は、だから私は、コンストラクタを使用して新しいオブジェクトを作成するとき:

var obj = new MyConstructor(); 

は、そのオブジェクトは、 MyConstructorを指すコンストラクタフィールドを継承します。 2番目のケースでは上書きはなかったので、2番目のオブジェクトはコンストラクタフィールドを直接 Object.prototypeから継承しました。

+1

新しく設定したプロトタイプオブジェクト(myProto)に値MyConstructor2のコンストラクタプロパティを追加する必要があります。 – Redu

答えて

3

Functionオブジェクトには、prototypeプロパティがあります。そのコンストラクタプロパティは関数を参照しています。 Objectリテラル構文を使用して新しいプロトタイプを作成すると、そのコンストラクターが文字通りObject関数である新しいオブジェクトが作成されます。

function MyConstructor2() { 

} 

MyConstructor2.prototype = { 
    constructor: MyConstructor2 
};