javascript - 访问父类中的 JavaScript 类属性
问题描述
在 ES6 中有什么方法可以做到这一点 - 或者如果不是(似乎很可能)有一个很好的解决方案:
class Parent {
constructor() {
console.log(this.name);
}
}
class Child extends Parent {
name = "Child Name";
}
const c = new Child();
// Should console.log "Child Name";
(来自 Python,它完全可以工作!)
解决方案
在孩子初始化他们的实例数据之前调用父母的构造函数,因此您不能在父母的构造函数中引用孩子的实例。那是错误的 OOP 设计(至少在 Javascript 中)。如果父级想要访问构造函数中的某个属性,则在父级的构造函数中定义并初始化该属性(子级仍然可以使用它)。
父母不应该依赖孩子——孩子依赖父母。
所以,这是有缺陷的 OOP 设计。您没有展示您要解决的实际问题,因此我们无法真正建议针对实际问题的正确设计。
回顾一下,事情的顺序是:
- 子构造函数被调用
- 子构造函数调用
super(...)
以执行父构造函数 - 父构造函数初始化其实例数据
- 父构造函数返回后,子构造函数有机会初始化其实例数据
如果使用 ES6 类定义,您无需将这种顺序更改为不同的东西。
根据您对此答案的最新评论,我认为没有更好的方法,而不仅仅是为每个孩子添加额外的代码行:
class Parent {
constructor(name) {
if (!name) {
// could also throw an exception here if not
// providing a name is a programming error and is not allowed
this.name = "Default Name";
} else {
this.name = name;
}
console.log(this.name);
}
}
class ChildA extends Parent {
constructor() {
super("ChildA Name");
}
}
class ChildB extends Parent {
constructor() {
super("ChildB Name");
}
}
const c = new ChildA();
// Should console.log "ChildA Name";
推荐阅读
- javascript - 带有 $group 的 Angular controller.js 聚合方法
- javascript - React - sinon 测试 - 获取 TypeError:无法读取未定义的属性“子字符串”
- docker - Kafka Streams 无法连接到无 Zookeeper 代理
- mysql - 为什么我的十进制在我的数据库中保存为逗号而不是点
- r - R中的模型置信度集(MCS)
- vba - 从 VBA 实现 IRibbonExtensibility_GetCustomUI
- tomcat - Tomcat 升级:如何查找不再可用的类的信息
- ssl - 证书管理器挑战悬而未决
- html - DIV上的CSS动画渐变边框
- c# - 在 .NET5 中调出 Sharepoint 提示