Nodejs为什么数组初始化与原型静态?

考虑下面的代码

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); 

如果我们按照原样运行它,我们会注意到在其任何实例中修改Class的array都是静态完成的 – 对a中数组的更改反映在b ,反之亦然。 然而,修改strvariables,尽pipe初始化与array相同的方式不是静态的。

如果我们取消注释构造函数中的行,那么在任何情况下对数组的更改都不会静态地完成。

我偶然发现了一个nodejs错误? 我无法在任何地方find有关这种情况的详细信息,那么是否有人可以解释为什么nodejs有这种行为?

对象属性( 直接指向对象属性)的分配总是会导致目标对象本身的属性。 另一方面, 查找属性将查阅原型链。

当您更改原型中存在的数组的内容时:

 a.array[0] = "foo"; 

您正在修改通过对象“a”查找属性“数组”时发现的对象。 该值在原型上find,所以这是在属性值赋值中使用的值。 这种说法在结构上是:

 (someObject)[0] = "foo"; 

这里的“someObject”是在原型上find的那个数组。

然而,在这里,你直接在一个对象上设置属性:

 a.str = "foo"; 

在这种情况下,JavaScript总是直接在目标对象上创build或更新一个属性,并且根本不会触及原型链。

这不是一个错误。 通过做

 Class.prototype.array = []; 

你创build一个共享属性。 但是通过这样做

 instance.array = [] 

您创build了一个实例属性,该属性在实例中既不共享也不可见。 通过做this.array = []; 在构造函数中,您只需重写共享引用。