JavaScript继承和对象字面量

6
在JavaScript中,有人说对象字面量具有原型链接,但函数对象既具有原型链接又具有原型属性。
基于以上内容,可以说继承(使用原型属性)只适用于函数对象(构造函数版本),而不适用于对象字面量吗?
此外,需要注意的是,在所有浏览器中都无法访问__proto__属性...

1
您不能更改现有对象的原型或在使用对象字面量时指定原型,因此,如果我正确理解您的问题,我会回答是的。 - Felix Kling
1
__proto__ 属性是非标准的,甚至在 FF 中已被弃用。我只是在谈论官方规范。但正如系统所说,每个对象都会继承自某些东西,唯一的问题是你是否可以影响原型链。 - Felix Kling
1
继承可以通过使用 Object.create(proto) 方法来实现对象字面量。此外,您还可以通过这种方式创建一个不继承基本对象的对象(使用 Object.create(null))。 - Sim
var base = {}; var child = Object.create(base); - Sim
@Sim:我认为你的陈述“使用Object.create(proto)方法可以使用对象字面量进行继承”有点令人困惑。您无法使用对象字面量语法设置对象的原型。在您的示例中,“base”可能是使用对象字面量创建的,但您也可以将其分配给“Func.prototype”,即“Func.prototype = {...}”。 “Object.create”只是创建对象的另一种方式,与对象字面量无关。 - Felix Kling
显示剩余8条评论
1个回答

2

简短版:

是的:无法通过分配对象的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接