2016-07-14 16 views
1

私はthis articleについてconstructorプロパティを読んでいると、それは次のように述べている:MDN constructorプロパティの説明の混乱

は、インスタンスの プロトタイプを作成したオブジェクトの関数への参照を返します。ここで

function Tree(name) { 
    this.name = name; 
} 

var theTree = new Tree('Redwood'); 
console.log('theTree.constructor is ' + theTree.constructor); 

インスタンスがtheTreeであり、そのプロトタイプはObject.getPrototypeOf(theTree)で、オブジェクトの機能ではなく、Tree次のとおりです。

は、彼らは例を与えます。私は何を誤解していますか?

+0

まあ、 'Tree' *は「Object関数」です。たぶんあなたのデバッグ環境/ブラウザの仕様に依存して、名前が解決されて 'Tree'または単にこの汎用" Object関数 "として表示されるかどうかに依存します。 – deceze

+0

@decezeですが、 'Tree'は' theTree'のプロトタイプを作成せず、インスタンスを作成しました。これは混乱する部分です –

+0

'console.log()'の中で文字列にキャストしないでください、それは重要な詳細を隠します。 –

答えて

2

オブジェクトのプロトタイプは、典型的には、そのコンストラクタ関数から継承されている:

function Tree() {} 
Tree.prototype.foo = function() {}; 

var theTree = new Tree(); 

theTreeは現在、プロトタイプチェーンからtheTree.fooを有しています。 function Treeはオブジェクトを初期化し、プロトタイプチェーンの内容も担当します。だから彼らは"インスタンスのプロトタイプを作成したObject関数"と表現しています。

+0

私は今、感謝を見る。ですから、基本的に 'constructor'プロパティは、オブジェクトのプロトタイプがどこから来たのか、オブジェクトを作成するためにどの関数が使われたのかを知ることと関連があります。 –

+0

私は、MDNがその文章をより直接的に書くことができるかどうかは議論の余地があると思います。 '.constructor'が"より関連性が高い "ものは、あなたがそれを使いたいものに依存します。そして、正直言って、これまで何にでも使う必要はなかったので、私はそれについてコメントするのが最善の立場にはいません。 – deceze

+0

ありがとう、ありがとう。 'theTree instanceof Tree'のような継承チェックで使用できるので、' prototype'に関連すると思います。 'Tree'が' theTree'のプロトタイプを作成した場合、 'Tree.prototype'は' theTreeプロトタイプチェーン。前提が十分だと思いますか? –

0

Object.getPrototypeOf(theTree)は、あなたのツリー関数のプロトタイプ

Object.getPrototypeOf(theTree) == Tree.prototype; // true 

両方が同じオブジェクト

を参照し、Tree.prototypeがにInfactは参照である「コンストラクタ」という名前のプロパティを持っていますツリー機能は

theTree.contructor == Tree.prototype.constructor ;// true 

は基本的にtheTreeがprotoリンク(____proto____)とTree.prototypeこのプロトリンクポイントがあります。 Tree.constructorを実行すると、protoリンクに実際に従い、Tree.prototypeに到達し、それ自体がコンストラクタを見つけます。Tree関数