实例化新对象引用相同 属性
Instantiating a New Object References The Same Property
为什么当我在 JavaScript 中实例化一个将另一个对象作为其属性之一的新对象时,它总是引用同一个对象?
例如
function test() {}
test.prototype.state = {
num: 0
};
var obj1 = new test();
var obj2 = new test();
obj1.state.num = 1;
console.log(obj1.state.num,obj2.state.num); // Outputs 1 1 instead of 1 0
此外,什么是让它在每次实例化时都创建一个新对象的合适方法属性?
因为这就是原型:所有实例之间的共享对象。您只显式创建 { num: 0 }
对象一次,因此它只会存在一次。 Javascript 在实例化新 test
时不会为您克隆它。通常原型用于 函数 ,这没有任何区别。如果你想要实例特定的属性,你需要在构造函数中创建它们:
function test() {
this.state = { num: 0 };
}
我想在下面的代码中解释。
function test() {
var o = {a:1};
this.geto = function(){return o.a};
this.seto = function(v){o.a = v};
}
test.prototype.p = {a:0};
var obj1 = new test();
var obj2 = new test();
obj1.p.a = 100;
obj1.seto(50);
console.log(obj1.p.a); // <- 100
console.log(obj2.p.a); // <- 100
console.log(obj2.geto()); // <- 1
console.log(obj1.geto()); // <- 50
在第一个代码中有一个闭包,它不是共享的。所有实例化的对象都有一个单独的闭包。在原型版本中,没有闭包,所有实例化对象都访问构造函数原型中的同一个对象。
还存在更复杂的闭包原型共享,我已经解释过here,其中我们通过原型共享闭包本身。
在您的代码中。status.num 似乎属于 class,而不是实例。将您的代码更改为如下内容:
function test() {
this.state = {num:0};//instance property
}
var obj1 = new test();
var obj2 = new test();
obj1.state.num = 1;
console.log(obj1.state.num,obj2.state.num);//1 0 as expected
为什么当我在 JavaScript 中实例化一个将另一个对象作为其属性之一的新对象时,它总是引用同一个对象?
例如
function test() {}
test.prototype.state = {
num: 0
};
var obj1 = new test();
var obj2 = new test();
obj1.state.num = 1;
console.log(obj1.state.num,obj2.state.num); // Outputs 1 1 instead of 1 0
此外,什么是让它在每次实例化时都创建一个新对象的合适方法属性?
因为这就是原型:所有实例之间的共享对象。您只显式创建 { num: 0 }
对象一次,因此它只会存在一次。 Javascript 在实例化新 test
时不会为您克隆它。通常原型用于 函数 ,这没有任何区别。如果你想要实例特定的属性,你需要在构造函数中创建它们:
function test() {
this.state = { num: 0 };
}
我想在下面的代码中解释。
function test() {
var o = {a:1};
this.geto = function(){return o.a};
this.seto = function(v){o.a = v};
}
test.prototype.p = {a:0};
var obj1 = new test();
var obj2 = new test();
obj1.p.a = 100;
obj1.seto(50);
console.log(obj1.p.a); // <- 100
console.log(obj2.p.a); // <- 100
console.log(obj2.geto()); // <- 1
console.log(obj1.geto()); // <- 50
在第一个代码中有一个闭包,它不是共享的。所有实例化的对象都有一个单独的闭包。在原型版本中,没有闭包,所有实例化对象都访问构造函数原型中的同一个对象。
还存在更复杂的闭包原型共享,我已经解释过here,其中我们通过原型共享闭包本身。
在您的代码中。status.num 似乎属于 class,而不是实例。将您的代码更改为如下内容:
function test() {
this.state = {num:0};//instance property
}
var obj1 = new test();
var obj2 = new test();
obj1.state.num = 1;
console.log(obj1.state.num,obj2.state.num);//1 0 as expected