Javascript class继承。 Subclass 改变了 main class 的属性?
Javascript class inheritance. Subclass changes main class's properties?
var Main = function(){};
Main.prototype = {
'times' : 0,
'request': function(){},
...
};
var SubA = function(){};
SubA.prototype = new Main() // same with Object.create(Main.prototype);
SubA.prototype.constructor = SubA;
var SubB = function(){};
SubB.prototype = new Main() // same with Object.create(Main.prototype);
SubB.prototype.constructor = SubB;
现在:
var sub_a = new SubA();
sub_a.times = 1;
var sub_b = new SubB();
// Here sub_b.times is already 1, how?
当我改变sub
类的属性时,Main
的属性也在改变,它不应该停留在0
吗?
正如评论已经指出的那样,您的确切问题是不正确的,实际上 sub_b.times
仍然是 0
。也许您的代码中发生了其他事情。
我会猜测 在您的特定问题之外 可能会发生什么,并通过下面的代码解释原始类型与引用类型。注意在我们的原型上存储 times
和 count
的区别:
var Main = function(){};
Main.prototype = {
'times' : 0,
'count': {value: 0}
};
var SubA = function(){};
SubA.prototype = new Main();
SubA.prototype.constructor = SubA;
var SubB = function(){};
SubB.prototype = new Main();
SubB.prototype.constructor = SubB;
var subA = new subA();
var subB = new subB();
我们的 times
属性 是原始值,当我们增加 subA.times 的原始值时,对 subB 没有影响,反之亦然:
console.log(subA.times); // 0
console.log(subB.times); // 0
subA.times = 1;
console.log(subA.times); // 1
console.log(subB.times); // 0
subB.times = 100;
console.log(subA.times); // 1
console.log(subB.times); // 100
然而,我们的 count
属性 是一个存储 value
原语的对象。对象是引用类型,简而言之,意味着 subA.count
和 subB.count
引用内存中的同一个对象,如果我们更改该对象的属性,它将反映在两者中。 如果我不得不猜测,这很可能是您实际实施中发生的情况。
console.log(subA.count.value); // 0
console.log(subB.count.value); // 0
subA.count.value = 1;
console.log(subA.count.value); // 1
console.log(subB.count.value); // 1
subB.count.value = 100;
console.log(subA.count.value); // 100
console.log(subB.count.value); // 100
最后一点:如果我们决定将我们的一个实例的 count
属性 重新分配给一个新对象,那么它将不再引用同一个对象并且将是独立的:
subA.count = {value: -1}; // New object
console.log(subA.count.value); // -1 (new object value)
console.log(subB.count.value); // 100 (old value from above)
subB.count.value = 99;
console.log(subA.count.value); // -1
console.log(subB.count.value); // 99
var Main = function(){};
Main.prototype = {
'times' : 0,
'request': function(){},
...
};
var SubA = function(){};
SubA.prototype = new Main() // same with Object.create(Main.prototype);
SubA.prototype.constructor = SubA;
var SubB = function(){};
SubB.prototype = new Main() // same with Object.create(Main.prototype);
SubB.prototype.constructor = SubB;
现在:
var sub_a = new SubA();
sub_a.times = 1;
var sub_b = new SubB();
// Here sub_b.times is already 1, how?
当我改变sub
类的属性时,Main
的属性也在改变,它不应该停留在0
吗?
正如评论已经指出的那样,您的确切问题是不正确的,实际上 sub_b.times
仍然是 0
。也许您的代码中发生了其他事情。
我会猜测 在您的特定问题之外 可能会发生什么,并通过下面的代码解释原始类型与引用类型。注意在我们的原型上存储 times
和 count
的区别:
var Main = function(){};
Main.prototype = {
'times' : 0,
'count': {value: 0}
};
var SubA = function(){};
SubA.prototype = new Main();
SubA.prototype.constructor = SubA;
var SubB = function(){};
SubB.prototype = new Main();
SubB.prototype.constructor = SubB;
var subA = new subA();
var subB = new subB();
我们的 times
属性 是原始值,当我们增加 subA.times 的原始值时,对 subB 没有影响,反之亦然:
console.log(subA.times); // 0
console.log(subB.times); // 0
subA.times = 1;
console.log(subA.times); // 1
console.log(subB.times); // 0
subB.times = 100;
console.log(subA.times); // 1
console.log(subB.times); // 100
然而,我们的 count
属性 是一个存储 value
原语的对象。对象是引用类型,简而言之,意味着 subA.count
和 subB.count
引用内存中的同一个对象,如果我们更改该对象的属性,它将反映在两者中。 如果我不得不猜测,这很可能是您实际实施中发生的情况。
console.log(subA.count.value); // 0
console.log(subB.count.value); // 0
subA.count.value = 1;
console.log(subA.count.value); // 1
console.log(subB.count.value); // 1
subB.count.value = 100;
console.log(subA.count.value); // 100
console.log(subB.count.value); // 100
最后一点:如果我们决定将我们的一个实例的 count
属性 重新分配给一个新对象,那么它将不再引用同一个对象并且将是独立的:
subA.count = {value: -1}; // New object
console.log(subA.count.value); // -1 (new object value)
console.log(subB.count.value); // 100 (old value from above)
subB.count.value = 99;
console.log(subA.count.value); // -1
console.log(subB.count.value); // 99