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
当您需要每个实例的唯一属性时,可以在构造函数中将其绑定到此属性。当您需要所有实例(如函数集)的公共属性时,可以将其绑定到原型。若您不知道,那个么原型中的属性可以在以后被重写 该死,你跑得太快了+谢谢你的解决方案。该死,你跑得太快了+感谢您的解答。谢谢您的解释!做标记作为回答!谢谢你的解释!做标记作为回答!