Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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 为什么修改一个实例上的值会更改另一个实例上的值?_Javascript - Fatal编程技术网

Javascript 为什么修改一个实例上的值会更改另一个实例上的值?

Javascript 为什么修改一个实例上的值会更改另一个实例上的值?,javascript,Javascript,为什么在下面的示例中foo.value会发生更改 var Zzz = function() {}; Zzz.prototype.foo = {}; Zzz.prototype.set = function (v) { this.foo.value = v; }; var Z1 = new Zzz(); Z1.set(100); var Z2 = new Zzz(); Z2.set(200); console.log(Z1.foo, Z2.foo); // 200, 200 co

为什么在下面的示例中
foo.value
会发生更改

var Zzz = function() {};

Zzz.prototype.foo = {};

Zzz.prototype.set = function (v) {
    this.foo.value = v;
};

var Z1 = new Zzz();
Z1.set(100);

var Z2 = new Zzz();
Z2.set(200);

console.log(Z1.foo, Z2.foo); // 200, 200
console.log(Z1 === Z2); // false
console.log(Z1.foo.value == Z2.foo.value); // true < WHY????
var Zzz=function(){};
Zzz.prototype.foo={};
Zzz.prototype.set=函数(v){
this.foo.value=v;
};
var Z1=新的Zzz();
Z1.套(100);
var Z2=新的Zzz();
Z2.套(200);
console.log(Z1.foo,Z2.foo);//200, 200
console.log(Z1==Z2);//假的
console.log(Z1.foo.value==Z2.foo.value);//真<为什么????

因为
foo
是原型的一部分,所以它就像Java或PHP等语言(可能还有许多其他语言)中的静态变量

这意味着更改其中一个类的值将影响该类的所有实例

对于单个实例,请尝试:

var Zzz = function() {
    this.foo = {};
};
Zzz.prototype.set = function(v) {
    this.foo.value = v;
};

因为
foo
是原型的一部分,所以它就像Java或PHP等语言(可能还有许多其他语言)中的静态变量

这意味着更改其中一个类的值将影响该类的所有实例

对于单个实例,请尝试:

var Zzz = function() {
    this.foo = {};
};
Zzz.prototype.set = function(v) {
    this.foo.value = v;
};

我想你已经有答案了,但万一你还是不明白

prototype
构造函数的属性是对象,其中所有实例的属性都引用该对象的属性

当您创建新实例并询问其属性(
foo
)时,JS将首先查看该实例并尝试查找其自己的属性
foo
。如果这里没有
foo
,那么JS将查看实例原型并询问那里的
foo

代码示例:

var Zzz = function() {};

Zzz.prototype.foo = {};

Zzz.prototype.set = function (v) {
    this.foo.value = v;
};

var Z1 = new Zzz();
Z1.set(100);

var Z2 = new Zzz();
Z2.set(200);

// but when we create new object only for Z1 instance
Z1.foo = {};
Z1.set(100); // this.foo in set function refers to that new object
console.log(Z1.foo, Z2.foo); // 100, 200

console.log(Z1.foo === Zzz.prototype.foo); // false
console.log(Z2.foo === Zzz.prototype.foo); // true
此外,如果稍后使用以下命令删除
foo
属性:

delete Z1.foo;
console.log(Z1.foo === Zzz.prototype.foo); // is true again

当您需要每个实例的唯一属性时,可以在构造函数中将其绑定到此属性。当您需要所有实例(如函数集)的公共属性时,可以将其绑定到原型。若您不知道,那个么原型中的属性可以在以后被重写

我想你已经有了答案,但万一你还是不明白

prototype
构造函数的属性是对象,其中所有实例的属性都引用该对象的属性

当您创建新实例并询问其属性(
foo
)时,JS将首先查看该实例并尝试查找其自己的属性
foo
。如果这里没有
foo
,那么JS将查看实例原型并询问那里的
foo

代码示例:

var Zzz = function() {};

Zzz.prototype.foo = {};

Zzz.prototype.set = function (v) {
    this.foo.value = v;
};

var Z1 = new Zzz();
Z1.set(100);

var Z2 = new Zzz();
Z2.set(200);

// but when we create new object only for Z1 instance
Z1.foo = {};
Z1.set(100); // this.foo in set function refers to that new object
console.log(Z1.foo, Z2.foo); // 100, 200

console.log(Z1.foo === Zzz.prototype.foo); // false
console.log(Z2.foo === Zzz.prototype.foo); // true
此外,如果稍后使用以下命令删除
foo
属性:

delete Z1.foo;
console.log(Z1.foo === Zzz.prototype.foo); // is true again

当您需要每个实例的唯一属性时,可以在构造函数中将其绑定到此属性。当您需要所有实例(如函数集)的公共属性时,可以将其绑定到原型。若您不知道,那个么原型中的属性可以在以后被重写

该死,你跑得太快了+谢谢你的解决方案。该死,你跑得太快了+感谢您的解答。谢谢您的解释!做标记作为回答!谢谢你的解释!做标记作为回答!