访问父类中的 JavaScript 类属性

use*_*537 8 javascript es6-class

在 ES6 中是否有可能实现这一点——或者如果不能的话是否有一个很好的解决方案(看起来很可能):

class Parent {
    constructor() {
        console.log(this.name);
    }
}

class Child extends Parent {
     name = "Child Name";
}

const c = new Child();
// Should console.log "Child Name";
Run Code Online (Sandbox Code Playgroud)

(来自 Python,它完全可以工作!)

jfr*_*d00 7

在子级初始化其实例数据之前调用父级的构造函数,因此您无法在父级的构造函数中引用子级的实例。这就是错误的 OOP 设计(至少在 Javascript 中)。如果父级想要访问构造函数中的属性,则在父级的构造函数中定义并初始化该属性(子级仍然可以使用它)。

父母不应该依赖孩子——孩子依赖父母。

所以,这是有缺陷的 OOP 设计。您没有展示您试图解决的实际问题,因此我们无法真正建议针对实际问题的正确设计。


回顾一下,事情的顺序是:

  1. 调用子构造函数
  2. 子构造函数调用super(...)执行父构造函数
  3. 父构造函数初始化其实例数据
  4. 父构造函数返回后,子构造函数有机会初始化其实例数据

如果使用 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";
Run Code Online (Sandbox Code Playgroud)