2017-11-16 16 views
0

1.1:xに直接アクセスすると、linkingObjectに直接アクセスできませんが、linkingObject.prototypeにアクセスするのはなぜですか?プロトタイプのアクセスと動作

1.2:xlinkingObjectに一度検索すると、デフォルトでエンジンが試合され、xのプロトタイプが検索されますか? .prototypeを明示的に指定する必要があるのはなぜですか?

1.3:これは奇妙なことをさらに説明するために、baseObjectがプロトタイプlinkingObjectであり、xプロパティが含まれていることも記載されています。

const baseObject = function() {}; 

baseObject.prototype.x = 5; 

const linkingObject = Object.create(baseObject); 

console.log(linkingObject.x); // 1.1: undefined 
console.log(linkingObject.prototype.x); // 1.2: 5 
console.log(linkingObject.prototype); // 1.3: baseObject { x:5 } 
+1

あなたは関数オブジェクトを継承しています。それをしないでください、ちょうど奇妙です。あなたは 'const baseObject = {x:5}'と '.prototype'プロパティ(' new'で使われるコンストラクタにのみ関係する)を必要としません。 – Bergi

答えて

0

あなたは、オブジェクトの継承チェーンの最初のエントリで関数オブジェクトのprototypeプロパティを混同しています。後者は、[[prototype]]と書かれていることがよくあります。これは、継承チェーンの開始を参照する内部値であるためです。オブジェクトの

[[プロトタイプ]]内部プロパティ(「スロット」と呼ばれる)は、コンストラクタのprototypeプロパティに設定され、又はObject.createによって作成されたオブジェクトの場合、最初の引数として指定されたオブジェクトの値にされています。

linkingObjectの[[prototype]]の値をbaseObjectに設定します。 linkingObjectを検索すると、継承チェーン(baseObjectのプロパティ)のprototypeが検索され、継承されたprototype値の定義済みのプロパティとしてlinkingObject.prototype.xが見つかります。

しかしbaseObject機能はそれほど存在しないlinkingObject.xプロパティが返すundefinedを探し、x性質自体を持っていません。

関連する問題