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是的-数组与常规对象没有太大区别,所以如果“数组”只是一个普通对象,那么所有东西(就这个问题和我的答案而言)都会完全相同。