ES6没有抽象方法或属性,但是我可以从继承类中获取父类中的一些方法或属性吗?
class ParentClass {
constructor(){
ParentClass.checkClildPropertyAccessibility();
ParentClass.checkClildMethodAccessibility();
ParentClass.checkClildStaticPropertyAccessibility();
ParentClass.checkClildStaticMethodAccessibility();
}
static checkClildPropertyAccessibility() {
console.log(ParentClass.childProperty);
}
static checkClildMethodAccessibility(){
ParentClass.childMethod()
}
static checkClildStaticPropertyAccessibility(){
console.log(ParentClass.childStaticProperty);
}
static checkClildStaticMethodAccessibility(){
ParentClass.clildStaticMethod()
}
}
class ChildClass extends ParentClass {
constructor(){
super();
ChildClass.childProperty = 'child\'s Property: OK';
}
childMethod(){
console.log('child\'s method OK');
}
// static property emulation is ES6
static get childStaticProperty() { return 'Child\'s static property: OK even ES6' }
static clildStaticMethod (){
console.log('Child\'s static method: OK');
}
}
let childClassInstance = new ChildClass();
概念是“我们必须在子类中定义一些属性和方法,但是父类需要它们在构造函数中使用”。
答案 0 :(得分:0)
可以将父类中的当前构造函数引用为静态方法中的this
,将实例方法中引用为this.constructor
。
这会导致潜在的设计问题,因为ParentClass
没有在ChildClass
中定义的方法和属性,而new ParentClass
会在不存在时导致错误{{1}调用。
答案 1 :(得分:0)
是,可以调用仅在ES2015类的子类中定义的方法。
class ParentClass {
constructor() {
this.childMethod();
this.initialize();
console.log(this.childProperty1);
console.log(this.childProperty2);
}
}
class ChildClass extends ParentClass {
constructor() {
super();
this.childProperty1 = 'child\'s Property: OK';
}
initialize() {
this.childProperty2 = 'child\'s Property 2: OK';
}
childMethod() {
console.log('Child\'s overriden method: OK');
}
}
let childClassInstance = new ChildClass();
注意initialize()
用于将初始值分配给childProperty2
。父构造函数将始终在子类构造函数中的任何其他代码之前运行,这就是在进行控制台调用时未初始化childProperty1
的原因。在父类中,this
将指向具有子类prototype
的对象。 在评论部分,Bergi
指出应该避免在父构造函数中调用重写方法的做法,因为overriden方法可能取决于子构造函数尚未设置的状态。
否,它不适用于静态方法。 即使将静态方法复制到子类,,当您引用ParentClass
时,您将获得在那里定义的方法。那里没有原型链。
编辑:来自评论部分的说明。