繁体   English   中英

Javascript类继承。 子类会更改主类的属性吗?

[英]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 也许您的代码中发生了其他事情。

我将猜测您的特定问题之外可能发生的情况,并通过以下代码解释原始类型与引用类型。 注意在我们的原型上存储timescount之间的区别:

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.countsubB.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM