gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:34:39 24 4
gpt4 key购买 nike

考虑以下代码

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com