javascript - Javascript 中的新对象是否具有原型(prototype)属性?

标签 javascript prototype-programming

这是一个具有学术值(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/

相关文章:

javascript - 如何防止公众查看您的 GA 属性 ID

javascript - HTML5 文件 API 修改 file.name

javascript - 多次调用类构造函数

javascript绑定(bind)对象的原型(prototype)函数

javascript - 在构造函数中向原型(prototype)添加属性

javascript - 为什么在原型(prototype)中定义属性被认为是一种反模式

javascript - 如何正确定义javascript原型(prototype)绑定(bind)?

javascript - 将 Excel 文件发送到 ASP.NET Web API

javascript - Chart.js - 未捕获的 TypeError : Object. defineProperty 在多个图表的非对象上调用

javascript - JavaScript 原型(prototype)继承的缺点是什么?