javascript - 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 = [];
以使每个子类都有自己的静态数组?
解决方案
A.arr
is 与is fromB.arr
一样不同。问题在于相当于,它将 的值替换为新值。不会替换 的内容,它是对 中相同对象的引用。A.id
B.id
A.id++
A.id = A.id + 1
A.id
A.arr.push('a')
A.arr
B.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}`);
推荐阅读
- python - Python 代码在客户端启动之前不会执行,即使 print() 正在正确执行
- javascript - 如何在 jquery 中单击获取动态元素的值
- shapefile - 如何修复错误原因:java.lang.OutOfMemoryError:geoserver 中的 Java 堆空间
- wordpress - 更改或重定向默认 WPML 语言的 Wordpress URL 代码
- java - 将 Lambda 用作 AWS Lex 的代码挂钩时出错
- python-3.x - Python3 - 在评估之前将循环输出组合在一起?
- python - 根据标签内容调整 QTabWidget 大小的问题 (PyQT)
- html - 如何使用文本框中的模式字段在 html 中使用正则表达式验证字符串?
- javascript - Javascript 验证 - 交叉验证
- php - 如何在每 +5 值后调用函数?