在JavaScript中,有人说对象字面量具有原型链接,但函数对象既具有原型链接又具有原型属性。
基于以上内容,可以说继承(使用原型属性)只适用于函数对象(构造函数版本),而不适用于对象字面量吗?
此外,需要注意的是,在所有浏览器中都无法访问__proto__属性...
基于以上内容,可以说继承(使用原型属性)只适用于函数对象(构造函数版本),而不适用于对象字面量吗?
此外,需要注意的是,在所有浏览器中都无法访问__proto__属性...
简短版:
是的:无法通过分配对象的prototype
属性来设置或修改原型链。您不能通过创建一个带有名为prototype
的属性的对象字面量,然后给它设置继承来设置继承。此类属性将被称为prototype
,但不会用于原型继承。
详细版:
如果访问的属性未定义,则会检查该对象的继承链。因此,如果obj ['prop']
未定义,则将检查obj.prototype ['prop']
。在许多浏览器中,prototype
属性在内部实现为__proto__
属性,但这并不重要。相反,重点是如果某个属性未定义,则会检查该对象的原型。
正如评论中的人所说,只有通过将该对象分配给函数的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
__proto__
属性是非标准的,甚至在 FF 中已被弃用。我只是在谈论官方规范。但正如系统所说,每个对象都会继承自某些东西,唯一的问题是你是否可以影响原型链。 - Felix KlingObject.create(proto)
方法来实现对象字面量。此外,您还可以通过这种方式创建一个不继承基本对象的对象(使用Object.create(null)
)。 - Simvar base = {}; var child = Object.create(base);
- Sim