实例化一个新对象引用同一属性



为什么当我在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 }对象一次,因此仅存在一次。实例化新的test时,JavaScript不会为您键入它。通常,原型用于函数,这没有任何区别。如果要实例特定属性,则需要在构造函数函数中创建它们:

function test() {
    this.state = { num: 0 };
}

在您的代码.status.num中似乎属于类,而不是实例。将您的代码更改为这样的东西:

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

我想在以下代码中解释。

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

在第一个代码中有一个封闭,并且没有共享。所有实例化对象都有一个单独的封闭。在原型版本中,没有闭合,所有实例化对象访问了构造函数的原型。

的原型。

也存在一个更复杂的原型封闭共享,我在这里解释了我们通过原型共享封闭方式。

最新更新