Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs为什么用prototype static初始化数组?_Javascript_Node.js_Oop_Prototype - Fatal编程技术网

Javascript Nodejs为什么用prototype static初始化数组?

Javascript Nodejs为什么用prototype static初始化数组?,javascript,node.js,oop,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"

考虑以下代码

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
中数组的更改反映在
b
中,反之亦然。但是,修改
str
变量(尽管初始化方式与
array
相同)不是静态完成的

如果我们取消对构造函数中的行的注释,那么在任何实例中对数组的更改都不再是静态的


我是不是偶然发现了一个nodejs bug?我在任何地方都找不到有关这种情况的详细信息,所以请任何人解释一下为什么nodejs会有这种行为?

这不是一个bug。通过做

Class.prototype.array = [];
您可以创建一个共享的属性。但是通过这样做

instance.array = []

您创建的实例属性在实例之间既不共享也不可见。通过执行
this.array=[]在构造函数中,您只需覆盖共享引用。

这不是错误。通过做

Class.prototype.array = [];
您可以创建一个共享的属性。但是通过这样做

instance.array = []

您创建的实例属性在实例之间既不共享也不可见。通过执行
this.array=[]
在构造函数中,您只需覆盖共享引用。

对对象属性的赋值(直接对对象属性)总是在目标对象本身上生成属性。另一方面,属性的查找将参考原型链

更改原型上存在的数组内容时:

a.array[0] = "foo";
您正在修改通过对象“a”查找属性“array”时找到的对象。该值在原型上找到,因此这是属性值赋值中使用的值。该声明在结构上是:

(someObject)[0] = "foo";
这里的“someObject”是在原型上找到的数组

但是,在这里,您直接在对象上设置属性:

a.str = "foo";

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

对对象属性的赋值(直接对对象属性)总是在目标对象本身上产生属性。另一方面,属性的查找将参考原型链

更改原型上存在的数组内容时:

a.array[0] = "foo";
您正在修改通过对象“a”查找属性“array”时找到的对象。该值在原型上找到,因此这是属性值赋值中使用的值。该声明在结构上是:

(someObject)[0] = "foo";
这里的“someObject”是在原型上找到的数组

但是,在这里,您直接在对象上设置属性:

a.str = "foo";

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

节点和浏览器中的行为没有区别。这就是JavaScript的工作方式。Node和浏览器中的行为没有区别。这就是JavaScript的工作方式。所以基本上
a.array
b.array
都是对
Class.prototype.array
的引用?对不起,如果我使用的是错误的术语,我来自C++背景。对-“数组”属性不存在于实例中(除非您不注释构造函数中的行),所以在原型上找到。从C++中了解关于类和继承的所有东西是个好主意,因为尽管JavaScript看起来很相似,但却非常不同。@ Pointy,你是指引用对象吗?ie(typeof dataType=='object'),看来您的推理对引用对象也很有效。。(即a.myObject.anyProperty=“anyValue”将有效地对b.myObject.anyProperty=“anyValue”具有相同的效果)一旦分配a.myObject.anyProperty,b.myObject.anyProperty将具有相同的效果value@achan是的-数组与常规对象没有太大区别,所以如果“数组”只是一个普通对象,那么是的(就这个问题和我的答案而言)基本上是相同的。所以基本上< C++ >数组> <代码> >代码> b>数组> <代码>是对代码> >类。原型。数组< /代码>的抱歉。如果我使用错误的术语,我来自C++背景。右-“数组”属性不存在于实例中。(除非你不注释构造函数中的那行),所以它在原型上找到了。从C++中了解关于类和继承的所有东西是个好主意,因为尽管JavaScript看起来很相似,但它却大不相同。@ Pointy,你是指引用对象吗?IE(类型DATA(= DATA)=“对象”),您的推理似乎也适用于引用对象..(即a.myObject.anyProperty=“anyValue”将有效地对b.myObject.anyProperty=“anyValue”产生相同的效果)分配a.myObject.anyProperty后,b.myObject.anyProperty将具有相同的属性value@achan是的-数组与常规对象没有太大区别,所以如果“数组”只是一个普通对象,那么所有东西(就这个问题和我的答案而言)都会完全相同。