JavaScript では、オブジェクト リテラルにはプロトタイプ リンクがあると言われていますが、関数オブジェクトにはプロトタイプ リンクとプロトタイプ プロパティの両方があります。
以上のことから、(prototype プロパティを使った) 継承は関数オブジェクト (コンストラクタ版) でのみ可能であり、オブジェクトリテラルでは可能ではないと言えるでしょうか?
また、追加するには__proto__
、すべてのブラウザーでプロパティにアクセスできるわけではありません...
JavaScript では、オブジェクト リテラルにはプロトタイプ リンクがあると言われていますが、関数オブジェクトにはプロトタイプ リンクとプロトタイプ プロパティの両方があります。
以上のことから、(prototype プロパティを使った) 継承は関数オブジェクト (コンストラクタ版) でのみ可能であり、オブジェクトリテラルでは可能ではないと言えるでしょうか?
また、追加するには__proto__
、すべてのブラウザーでプロパティにアクセスできるわけではありません...
ショートバージョン:
prototype
はい: オブジェクトのプロパティに割り当てることによって、プロトタイプ チェーンを設定または変更することはできません。オブジェクト リテラルを使用してオブジェクトを作成し、それに というプロパティを指定して継承を設定することはできませんprototype
。このようなプロパティは と呼ばれますがprototype
、プロトタイプの継承では考慮されません。
より長いです:
であるプロパティにアクセスするとundefined
、そのオブジェクトの継承チェーンがチェックされます。したがって、 の場合はobj['prop']
チェックされます。多くのブラウザーでは、プロパティはプロパティとして内部的に実装されていますが、それは重要ではありません。むしろ、重要なのは、あるプロパティがである場合、オブジェクトのプロトタイプがそのプロパティについてチェックされるということです。undefined
obj.prototype['prop']
prototype
__proto__
undefined
prototype
人々がコメントで言ったように、オブジェクトを関数のプロパティに割り当て、その関数をコンストラクターとして使用することによって、上記の継承を提供するプロトタイプをオブジェクトに与えることしかできません。
ただし、prototype
コンストラクター呼び出しによって生成されるオブジェクトのプロパティは ではありませんobject.hasOwnProperty('prototype')
。一方、prototype
プロパティをオブジェクトに割り当てると、そのオブジェクトはobject.hasOwnProperty('prototype')
にobject.prototype
なりますが、プロトタイプ チェーンとは何の関係もありません。通常のプロパティになるだけで、たまたま が呼び出されますprototype
。
これを実証するには:
var foo = {};
foo.prototype = {bar: 'hello'};
console.log(foo.bar); // undefined
console.log(foo.prototype); // Object {bar: "hello"}
console.log(foo.hasOwnProperty('prototype')); // true
var Foo = function() {};
Foo.prototype = {bar: 'hello'};
var f = new Foo;
console.log(f.bar); // 'hello';
console.log(f.hasOwnProperty('bar')); // false
console.log(f.prototype); // undefined
console.log(f.hasOwnProperty('prototype')); // false