javascript - 修改对象的原型(prototype)可能会也可能不会影响这些实例

标签 javascript

这段代码:

function A(){}

A.prototype = {
    a : 5
}

var b = new A();
console.log('b.a : ' + b.a);

A.prototype = {
    a : 10
}

console.log('b.a : ' + b.a);

产生:
b.a:5
b.a:5

虽然下面的代码修改了 A 现有实例的原型(prototype):

function A(){}

A.prototype = {
    a : 5
}

var b = new A();
console.log('b.a : ' + b.a);

A.prototype.a = 10;

console.log('b.a : ' + b.a);

并产生:
b.a:5
b.a:10

怎么会这样?

最佳答案

prototype[[prototype]](或 __proto__)之间的混淆。

前者是一个(正常的、非魔法的)属性,在从构造函数创建的任何对象中将被设置为后者(这是内部的,通常不要弄乱)。因此,当您执行 b = new A() 时,Aprototype 变为 b[[原型(prototype)]]。当我们说在 JavaScript 中属性首先在对象上查找,然后在原型(prototype)链上查找时,就是这个 [[prototype]] 的意思。

当您在第二种情况下更改 A.prototype.a 时,您同时更改了 b[[prototype]]时间(因为它是同一个对象)。

当您将新对象分配给 A.prototype 时,它不再与 b[[prototype]] 是同一对象>。因此,b.aA.prototype.a 分离。

关于javascript - 修改对象的原型(prototype)可能会也可能不会影响这些实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263285/

相关文章:

javascript - 为什么将服务注入(inject)第二个 Controller 后,AngularJS 1.4.8 应用程序无法运行?

javascript - 预期的标识符、字符串或数字

javascript - Vue 路由器和 VueJS react 性

javascript - 如何在没有div的情况下自动将内容拆分为2行

javascript - 过滤函数中的一行中有多个三元运算符

javascript - 我可以通过什么方式(如果有的话)获取 javascript 中匿名函数闭包的引用?

javascript - 现场尝试了多种解决方案,均无效 : Play <audio> on Konami code

javascript - 获取反向引用值并修改这些值

javascript - ExtJS ComboBox 中的多个字段

javascript - PHP - JSON 数组到 javascript 数据表库