6

JavaScript では、オブジェクト リテラルにはプロトタイプ リンクがあると言われていますが、関数オブジェクトにはプロトタイプ リンクとプロトタイプ プロパティの両方があります。

以上のことから、(prototype プロパティを使った) 継承は関数オブジェクト (コンストラクタ版) でのみ可能であり、オブジェクトリテラルでは可能ではないと言えるでしょうか?

また、追加するには__proto__、すべてのブラウザーでプロパティにアクセスできるわけではありません...

4

1 に答える 1

2

ショートバージョン:

prototypeはい: オブジェクトのプロパティに割り当てることによって、プロトタイプ チェーンを設定または変更することはできません。オブジェクト リテラルを使用してオブジェクトを作成し、それに というプロパティを指定して継承を設定することはできませんprototype。このようなプロパティは と呼ばれますがprototype、プロトタイプの継承では考慮されません。

より長いです:

であるプロパティにアクセスするとundefined、そのオブジェクトの継承チェーンがチェックされます。したがって、 の場合はobj['prop']チェックされます。多くのブラウザーでは、プロパティはプロパティとして内部的に実装されていますが、それは重要ではありません。むしろ、重要なのは、あるプロパティがである場合、オブジェクトのプロトタイプがそのプロパティについてチェックされるということです。undefinedobj.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
于 2013-03-08T19:47:03.990 に答える