gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:01:15 25 4
gpt4 key购买 nike

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

我将猜测在您的具体问题之外可能会发生什么,并通过下面的代码解释原始类型与引用类型。请注意在我们的原型(prototype)上存储 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

关于Javascript类继承。子类更改主类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com