在获取方法

时间:2018-02-14 16:29:28

标签: javascript typescript ecmascript-6

this answer未讨论的一个解决方案是在派生类中实现一个get方法,该方法返回一个字符串文字(但不是成员属性,因为这基本上是同一个问题):

class Base {
    constructor() { console.log( this.color ) }
    public get color(): string { return 'blue' }
}

class Literal extends Base {
    public get color(): string { return 'red' }
}

class Member extends Base {
    private _color: string = 'green'
    public get color(): string { return this._color }
}

let b = new Base() // => 'blue'
let l = new Literal() // => 'red'
let m = new Member() // => undefined

使用此方法是否存在任何问题/失败,例如效率,发布的JavaScript - 与链接答案中提供的解决方案相比?

1 个答案:

答案 0 :(得分:0)

类字段的通常含义是它们在子类中提供了开销:

class Member extends Base {
    protected _color: string = 'green'
    public get color(): string { return this._color }
}

class Foo extends Member {
    protected _color: string = 'orange'
}

_color将被分配到'绿色'然后到橙色'在Foo实例化。请注意,_color应受到保护,以便重新分配。

这不是字符串值的一个大问题,但它存在,如果_color是不需要为每个实例实例化的复杂对象,则可能会出现问题。

这可以通过将属性移动到类原型来解决:

interface Member extends Base {
  _color: IComplexColor;
}
class Member extends Base {
    public get color(): string { return this._color.toString() }
}
Member.prototype._color = new SomeComplexColorClass('green');

class Foo extends Member {}
Foo.prototype._color = new SomeComplexColorClass('orange');

请注意,在这种情况下,类声明应该与接口合并,这会导致_color公开,因为没有初始化程序的protected _color;会导致strictPropertyInitialization编译器选项出现问题。这个解决方案并不适用于TypeScript,因为它需要使用变通方法来输入系统,但它会产生更清晰的输出。

对于具有字符串属性和相对较短的原型链的类,这可以被认为是初步优化。