我在stackoverflow上搜索答案时偶然发现了这个帖子,基本上所有答案都找到了,但仍然很难从中提取要点。
访问方式:
假设有一个类Foo,可能是从其他一些类派生的,也可能有更多的类从它派生而来。然后进行访问:
1. 通过Foo类的静态方法/获取器进行访问:
* 可能会重写某些静态方法/获取器:
- this.method()
- this.property
* 可能会重写某些实例方法/获取器:
- 设计上不可能
2. 通过Foo类的实例方法/获取器进行访问:
* 可能会重写某些静态方法/获取器:
- this.constructor.method()
- this.constructor.property
* 可能会重写某些实例方法/获取器:
- this.method()
- this.property
* 自己的非重写静态方法/获取器:
- Foo.method()
- Foo.property
* 自己的非重写实例方法/获取器:
- 不可能(除非使用某些解决方法):
请注意,在使用箭头函数或显式绑定到自定义值的方法/获取器时,使用“this”不起作用。
背景:
1. 当在实例方法/获取器的上下文中时:
* this指的是当前实例。
* super基本上指的是相同的实例,但是有点像在访问当前类扩展的一些方法/获取器(通过使用Foo的原型)。
* 它被创建时用于定义实例的类可以通过this.constructor获得。
2. 当在静态方法/获取器的上下文中时,没有“当前实例”,因此:
* this可用于直接引用当前类的定义。
* super也不是指某个实例,而是指当前一个扩展了某个类的静态方法/获取器。
结论:
尝试这段代码:
class A {
constructor( input ) {
this.loose = this.constructor.getResult( input );
this.tight = A.getResult( input );
console.log( this.scaledProperty, Object.getOwnPropertyDescriptor( A.prototype, "scaledProperty" ).get.call( this ) );
}
get scaledProperty() {
return parseInt( this.loose ) * 100;
}
static getResult( input ) {
return input * this.scale;
}
static get scale() {
return 2;
}
}
class B extends A {
constructor( input ) {
super( input );
this.tight = B.getResult( input ) + " (of B)";
}
get scaledProperty() {
return parseInt( this.loose ) * 10000;
}
static get scale() {
return 4;
}
}
class C extends B {
constructor( input ) {
super( input );
}
static get scale() {
return 5;
}
}
class D extends C {
constructor( input ) {
super( input );
}
static getResult( input ) {
return super.getResult( input ) + " (overridden)";
}
static get scale() {
return 10;
}
}
let instanceA = new A( 4 );
console.log( "A.loose", instanceA.loose );
console.log( "A.tight", instanceA.tight );
let instanceB = new B( 4 );
console.log( "B.loose", instanceB.loose );
console.log( "B.tight", instanceB.tight );
let instanceC = new C( 4 );
console.log( "C.loose", instanceC.loose );
console.log( "C.tight", instanceC.tight );
let instanceD = new D( 4 );
console.log( "D.loose", instanceD.loose );
console.log( "D.tight", instanceD.tight );
SomeObject.print
感觉很自然。但是,如果我们在谈论静态方法,那么this.n
毫无意义,因为此时不存在实例。 - dfsqprintN
并非静态方法。 - simonzack