首页 > 解决方案 > JavaScript:继承静态对象,如静态原语

问题描述

我有以下代码:

class Base {
 static id = 5;
 static arr = [];
}

class A extends Base {}
class B extends Base {}

这为每个子类提供了自己的静态 id 属性:

A.id++;

console.log(A.id) : 6  (Only this one got increased)
console.log(B.id) : 5
console.log(Base.id) : 5

但是,对象并非如此。创建子类时,会传递对基类对象的引用,而不是(在基元的情况下)简单的副本。这给出了以下结果:

A.arr.push('a');

console.log(A.arr) : ['a']
console.log(B.arr) : ['a']     (I want this to stay empty)
console.log(Base.arr) : ['a']  (I want this to stay empty)

我将如何进行更改static arr = [];以使每个子类都有自己的静态数组?

标签: javascriptnode.jsclassoopinheritance

解决方案


A.arris 与is fromB.arr一样不同。问题在于相当于,它将 的值替换为新值。不会替换 的内容,它是对 中相同对象的引用。A.idB.idA.id++A.id = A.id + 1A.idA.arr.push('a')A.arrB.arr

这与类或静态成员无关。观察:

let a = [];
let b = a;
a.push(1);
console.log('a refers to the same object as b; change that object, both a and b change');
console.log(`a=${a}; b=${b}`);
b = [...a, 2];
console.log('b refers to a different object from a');
console.log(`a=${a}; b=${b}`);

我假设您在问如何为每个子类分配一个新对象。由于 AFAIK JavaScript 没有子类挂钩,我相信唯一的方法是为每个子类手动完成。

class Base {
  static arr = [];
}

class A extends Base {
  static arr = [];
}
class B extends Base {
  static arr = [];
}

A.arr.push(1);
B.arr.push(2);
console.log(`A.arr=${A.arr}; B.arr=${B.arr}`);

另一种方法是使用静态吸气剂为您完成。例如,这可能有效:

class Base {
  static _arr = null;
  static get arr() {
    return (this._arr ??= []);
  }
}

class A extends Base {}
class B extends Base {}

A.arr.push(1);
A.arr.push('a');
B.arr.push(2);
B.arr.push('b');
console.log(`A.arr=${A.arr}; B.arr=${B.arr}`);


推荐阅读