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__
の場合はどうしてですか?
ご迷惑をおかけいたします。なぜなら、複数の同様の質問があっても、私はそれらの質問に答えることができないからです。
Object.createはオブジェクトをコピーしません。渡すオブジェクトにプロトタイプを設定してオブジェクトを作成します。 '(new Bar())。speak();'( '作業(および出力 "Foo")プロトタイプチェーンは、あなたが思っているところから削除された1つのオブジェクトです。 'console.log(Bar.prototype.prototype)'を試してください。 – david
あなたが見ているものを説明する別の方法は、console.logはオブジェクトの 'ownProperties'だけを出力し、プロトタイプチェーンに沿って見つけられるすべてのプロパティ/メソッド。すべてのチェーンを表示したい場合は、独自のログ機能を作成してください。 – GameAlchemist