在 JavaScript 中,据说对象字面量具有原型链接,但函数对象同时具有原型链接和原型属性。
因此,基于上述内容,是否可以说继承(使用原型属性)仅适用于函数对象(构造函数版本)而不适用于对象文字?
另外,要补充的__proto__
是,并非所有浏览器都可以访问该属性...
在 JavaScript 中,据说对象字面量具有原型链接,但函数对象同时具有原型链接和原型属性。
因此,基于上述内容,是否可以说继承(使用原型属性)仅适用于函数对象(构造函数版本)而不适用于对象文字?
另外,要补充的__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