我刚刚开始阅读 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:
Figure 1. A basic object with a prototype.
我的问题...
为什么该图显示了基本对象字面量的 foo 原型(prototype)?
如果我创建了两个对象,它表明情况并非如此:-
- 对象一——函数对象/构造函数
- 对象二 - 一个基本的对象字面量,带有像字典一样的键/值对
如果我使用调试器,它表明对象一确实创建了一个 One.prototype,它在链的更下方也有一个 Object.prototype,但对象二没有 two.prototype,而是直接进入对象.原型(prototype)。
我是不是误解了原型(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/