考虑以下代码
Class = function()
{
//this.array = [];
}
Class.prototype.array = [];
Class.prototype.str = null;
var a = new Class();
var b = new Class();
a.array.push("a");
console.log (a.array);
b.array.push("b");
console.log (b.array);
a.str = "a";
console.log (a.str);
console.log (b.str);
b.str = "b";
console.log (a.str);
console.log (b.str);
如果我们按原样运行它,我们会注意到在其任何实例中修改类的 array
都是静态完成的 - 对 a
中数组的更改反射(reflect)在b
反之亦然。然而,修改 str
变量,虽然以与 array
相同的方式初始化,但并不是静态完成的。
如果我们取消注释构造函数中的行,则任何实例中对数组的更改都不会再静态完成。
我是不是偶然发现了一个 nodejs 错误?我在任何地方都找不到有关这种情况的详细信息,所以任何人都可以解释为什么 nodejs 有这种行为吗?
最佳答案
对对象属性的赋值(直接给对象属性)总是会导致目标对象本身的属性。另一方面,查找 属性将查询原型(prototype)链。
当您更改原型(prototype)上存在的数组内容时:
a.array[0] = "foo";
您正在修改通过对象“a”查找属性“array”时找到的对象。该值是在原型(prototype)上找到的,因此这是在属性值分配中使用的值。该声明在结构上是:
(someObject)[0] = "foo";
这里的“someObject”是在原型(prototype)上找到的数组。
然而,在这里,您直接在对象上设置属性:
a.str = "foo";
在这种情况下,JavaScript 总是直接在目标对象上创建或更新属性,根本不会触及原型(prototype)链。
关于javascript - Nodejs 为什么用原型(prototype)静态初始化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782924/