2016-03-23 6 views
1

StackOverflowでほとんどの記事を読んでいても、今はプロトタイプと実際は非常に混同されています。.prototypeと[[prototype]]。 .prototypeが空のオブジェクトであるのはなぜですか?

function Foo() { 

} 

Foo.prototype.speak = function() { 
    console.log('Foo'); 
}; 

function Bar() { 

} 

console.log(Bar.prototype); // {} 

Bar.prototype = Object.create(Foo.prototype); 

console.log(Bar.prototype); // {} ----- (1) 

Bar.prototype.speak = function() { // ----------(2) 
    console.log('Bar'); 
}; 

console.log(Bar.prototype); // { speak: [Function] } ----- (3) 

質問:

1)なぜObject.create(1)空のオブジェクトです。 speak methodのオブジェクトをFooから戻すべきではありませんか?

2)私は実際に何が変わるのですか(2) ?? Barオブジェクトまたはprototypeオブジェクトですか?実際に何が起こっていますか?

3)(3)で何が起こっているのですか?

4)[prototype]はこれにどのように関与していますか?私が知っていることは、[[prototype]]は、現在のオブジェクトにプロパティが含まれていない場合にルックアップに使用されることです。

.prototype !== [[prototype]]ただし、[[prototype]] === __proto__の場合はどうしてですか?

ご迷惑をおかけいたします。なぜなら、複数の同様の質問があっても、私はそれらの質問に答えることができないからです。

+1

Object.createはオブジェクトをコピーしません。渡すオブジェクトにプロトタイプを設定してオブジェクトを作成します。 '(new Bar())。speak();'( '作業(および出力 "Foo")プロトタイプチェーンは、あなたが思っているところから削除された1つのオブジェクトです。 'console.log(Bar.prototype.prototype)'を試してください。 – david

+0

あなたが見ているものを説明する別の方法は、console.logはオブジェクトの 'ownProperties'だけを出力し、プロトタイプチェーンに沿って見つけられるすべてのプロパティ/メソッド。すべてのチェーンを表示したい場合は、独自のログ機能を作成してください。 – GameAlchemist

答えて

-1

関数/オブジェクトのプロトタイプは、単に割り当てようとしても変更できません。オブジェクトの作成時に設定する必要があります。また、ES6の機能を使用して変更する必要があります。

だから、Bar.prototype = Object.create(Foo.prototype);は意味をなさない。

[[prototype]]は、オブジェクトの実際のプロトタイプの内部表現です。

これらの基本情報に基づいてテストケースを再編成し、説明を求める必要があります。

関連する問題