这是一个具有学术值(value)的纯粹微不足道的问题:
如果我创建一个新对象,要么通过:
var o = { x:5, y:6 };
或
var o = Object.create({ x:5, y:6 });
当我查询 o.prototype
属性时,我得到了 undefined
。我认为任何新创建的对象都会自动继承 Object.prototype
原型(prototype)。
此外,在此对象上调用toString()
(Object.prototype
的一种方法)工作得很好,这意味着o
确实继承自 Object.prototype
。那么为什么我会得到 undefined
呢?
最佳答案
实例及其构造函数之间存在差异。
当创建像 {a: 1}
这样的对象时,您正在创建 Object
构造函数的实例。 Object.prototype
确实可用,并且该原型(prototype)中的所有函数都可用:
var o = {a: 1};
o.hasOwnProperty === Object.prototype.hasOwnProperty; // true
但是 Object.create
做了一些不同的事情。它创建一个实例(一个对象),但插入一个额外的原型(prototype)链:
var o = {a: 1};
var p = Object.create(o);
链将是:
Object.prototype - o - p
这意味着:
p.hasOwnProperty === Object.prototype.hasOwnProperty; // true
p.a === o.a; // true
要获取实例“下”的原型(prototype),您可以使用 Object.getPrototypeOf
:
var o = {a: 1};
var p = Object.create(o);
Object.getPrototypeOf(p) === o; // true
Object.getPrototypeOf(o) === Object.prototype; // true
(以前,您可以使用 o.__proto__
访问实例的原型(prototype),但这已被弃用。)
请注意,您还可以按如下方式访问原型(prototype):
o.constructor === Object; // true
所以:
o.constructor.prototype === Object.prototype // true
o.constructor.prototype === Object.getPrototypeOf(o); // true
对于 Object.create
创建的对象,这会失败,因为它们没有构造函数(或者更确切地说,它们的构造函数是 Object
而不是您传递给 的对象Object.create
因为构造函数不存在)。
关于javascript - Javascript 中的新对象是否具有原型(prototype)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929159/