javascript - __原型(prototype)__ : function declaration versus object literal

标签 javascript prototype

我刚刚开始阅读 this article我卡在了第一段:

For the code:

var foo = { x: 10, y: 20 };

we have the structure with two explicit own properties and one implicit proto property, which is the reference to the prototype of foo:

enter image description here

Figure 1. A basic object with a prototype.

我的问题...

为什么该图显示了基本对象字面量的 foo 原型(prototype)?

如果我创建了两个对象,它表明情况并非如此:-

  • 对象一——函数对象/构造函数
  • 对象二 - 一个基本的对象字面量,带有像字典一样的键/值对

如果我使用调试器,它表明对象一确实创建了一个 One.prototype,它在链的更下方也有一个 Object.prototype,但对象二没有 two.prototype,而是直接进入对象.原型(prototype)。

enter image description here

我是不是误解了原型(prototype)的概念,或者这篇文章暗示对象文字有自己的原型(prototype)是不正确的?


编辑: 我已经放弃阅读这篇文章了,糟糕的英语让一个复杂的主题变得更加复杂。

this video 中的那个人回答我的问题并总结一下:

  • 每个对象都有一个__原型(prototype)__
  • 只有函数才有原型(prototype)
  • prototype是使用new操作符时使用的模板

最佳答案

__proto__ 来自构造函数的prototype

在第一种情况下,One 是您的构造函数。您还没有为 One.prototype 分配任何内容,因此它默认为 Object__proto__ 并且您获得了两个级别的继承。

如果您向该对象添加了一些东西,它们将显示为 One 原型(prototype)的一部分。

function One() {
  this.x = 4;
  this.y = 'hhh';
}
One.prototype.z = 'foobar';

var one = new One();

在第二种情况下,您正在创建一个以Object 为原型(prototype)的对象字面量,因此您只能从Object 原型(prototype)继承。原型(prototype)本身就是对象,因此如果您要向其添加属性,如下所示:

foo.__proto__.z = 'foobar';

您正在修改作为 foo 原型(prototype)的 Object 实例,它不会修改 Object 本身,只会修改它的特定实例。这就是文章的意思,foo 的原型(prototype)。

我刚刚在 V8 中做了一个测试,似乎对象字面量没有 Object 的实例,因为它是原型(prototype),它有 Object __proto__ 本身,所以你不应该修改 foo.__proto__,你会修改所有对象继承自的底层 Object 原型(prototype)。如果您确实希望修改它,您应该首先创建一个 Object 的新实例以添加到:

foo.__proto__ = {};
foo.__proto__.z = 'foobar';

例子:

var x = {};
x.__proto__ = {};
x.__proto__.z = 'foobar';
var y = {};
y.z; // undefined
Object.z; // undefined

对比

var x = {};
x.__proto__.z = 'foobar';
var y = {};
y.z; // 'foobar'
Object.z; // 'foobar'

在我看来,如果对象字面量自动为其 __proto__ 创建一个新的 Object 实例会更好。话又说回来,没有真正的理由去修改对象文字的原型(prototype)。

另请注意,您不应直接使用 __proto__,因为它已被弃用, future 的替代品是 strongly discouraged as well .你应该使用 Object.create用于在 Javascript 中实现继承。

关于javascript - __原型(prototype)__ : function declaration versus object literal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23247580/

相关文章:

javascript - 在我的小部件库中出现 'jQuery not defined' 错误

c++ - 函数原型(prototype)由于重载而干扰按引用传递?

javascript - Javascript 中的 isPrototypeOf 和 instanceof 有什么区别?

javascript - 如何使 JavaScript 代码与 Node.js 一起工作?

oop - 是否可以在 Scala 中进行基于原型(prototype)的编程?

javascript - Rad-grid 编辑模式启用通过 JavaScript 在复选框选择上禁用所需的字段验证

javascript - 属性 onclick ="function()"未按预期运行?

javascript - 使用 JavaScript 显示原型(prototype)模式,我如何命名包含在原型(prototype)中的函数?

javascript - 为什么我在 setState 上遇到不变违规 : Invariant Violation: Maximum update depth exceeded.?

javascript - 如何让 JQuery Mobile/JQuery UI 样式通过 mustache 模板进行