2017-06-08 3 views
1

のプロトタイプを再定義した後prototype.constructorない:上記のコードでオブジェクトコンストラクタ点は例えばコンストラクタ関数

function F() {}; 
F.prototype = { 
    test: function() { console.log('test'); } 
}; 

console.log(F.prototype.constructor); // [Function: Object] 

F.prototype = 'string'; 

var o = new F(); 
console.log(F.prototype.constructor); // [Function: String] 
console.log(F.prototype);    // string 
console.log(o.constructor);   // [Function: Object] 

o.test(); // Can't work 

を、最初のコンストラクタは、F.prototype.constructorF()あります。しかし、F.prototype'string'にリセットしました。そして、私の質問があります。

  1. リセット後F.prototype'string'、になぜF.prototype.constructor[Function: String]になります。つまり、 F.prototype.constructorの値が決まりますか?
  2. 私は、新しいオブジェクトがそうconstructorプロパティがあり、prototypeオブジェクトのプロパティを継承することが知られています。しかし、なぜオブジェクトpのコンストラクタは、元のコンストラクタ[Function: Object]、ない[Function: String]でしたか?

ありがとうございます。

+0

[質問のタイトルにタグを入れないでください](https://stackoverflow.com/help/tagging) – Liam

+0

OK、@Liam。アドバイスありがとうございます。 – zhenguoli

答えて

3

コンストラクタフィールドは、それが他のフィールドのようなものだ、特別なものではありません。 #1ため

回答:すべてのオブジェクトの内部__proto__フィールドでなければなりません

F.prototype = "string"; 
console.log(F.prototype.constructor); // function String 

ログfunction Stringそれは#2ため

console.log("string".constructor); // function String 

回答と同じですので、 typeof x === "object"。プロトタイプチェーンの終わりには必ずnull値がある(通常はObject.prototype.__proto__一つだ)、および許可されたいかなるサイクルはありません。 stringをコンストラクタprototypeフィールド(typeof F.prototype === "string")に割り当てました.__proto__として使用できないため、newオペレータはデフォルトのプロトタイプ、つまりObject.prototypeを使用してオブジェクトを作成するだけです。

+0

良い答え!ありがとう! – zhenguoli

+0

そして、その型 '[Function:Object]'だけでなく、コンストラクタのソースコードを表示する方法があるかどうかを知りたいのですが? – zhenguoli

+0

@zhenguoli 'constructor.toString()' – Bergi

関連する問題