javascript - Nodejs 为什么用原型(prototype)静态初始化数组?

标签 javascript node.js oop prototype

考虑以下代码

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/

相关文章:

javascript - 如何使用 jQuery 函数作为 .ready() 和 .change()

node.js - 5 分钟后 Node https 请求 ECONRESET

c# - 如何使用基构造函数实例化继承类?

javascript - 如何解决代理后面的 npm install 期间的连接问题?

javascript - 按钮淡入淡出 jQuery ASP.net

javascript - Node.js promise 有时不会执行

Node.js 服务器不可见

Java:测试两个对象之间多个属性的不等式

java - Kotlin /Java : should this singleton object have these sub-methods to check?

javascript - three.js:如何让透明的png Sprite 转换和接收阴影?