Javascript B扩展A:在B中设置将覆盖get
打字稿: 在已编译的类B中,这将覆盖Javascript B扩展A:在B中设置将覆盖get,javascript,typescript,ecmascript-6,getter-setter,Javascript,Typescript,Ecmascript 6,Getter Setter,打字稿: 在已编译的类B中,这将覆盖集合和获取的定义: Object.defineProperty(B.prototype, "name", { set: function (name) { this._name = name + "B"; }, enumerable: true, configurable: true }); 结果是,get name不再适用于类B: let b = new B() b.name = "test" console
集合
和获取
的定义:
Object.defineProperty(B.prototype, "name", {
set: function (name) {
this._name = name + "B";
},
enumerable: true,
configurable: true
});
结果是,get name
不再适用于类B:
let b = new B()
b.name = "test"
console.log(b.name) // undefined
有没有从类a继承getter的方法?下面的代码在TypeScript编译器中工作,没有任何错误:
class A {
protected _name: string = ""
set name(name: string) {
this._name = name
}
get name() {
return this._name
}
}
class B extends A {
// Removed _name declaration here
set name(name: string) {
super["name"] = name + "B" // <=== Using super here
}
get name() {
return super["name"] // <=== And here
}
}
var b = new B();
b.name = "foo";
console.log(b.name); // "fooB"
A类{
受保护的_name:string=“”
集合名称(名称:字符串){
这是我的名字
}
获取名称(){
返回此名称。\u
}
}
B类扩展了A类{
//已删除此处的名称声明
集合名称(名称:字符串){
super[“name”]=name+“B”//不幸的是,您要覆盖的是name
,而不是特定的getter/setter。您可以执行get name(){return super.name;}
但是。在您的情况下,这就足够了吗?
A中的名称
属性可能重复的声音被意外声明为私有。没有理由对静态属性名称使用括号符号,而应该修复编译器错误的原因(警告)@Bergi:name
不是私有的。编译器正在抱怨,因为只有基类的公共和受保护的方法可以通过'super'关键字访问,name
不是方法。当然,括号符号只是一种绕过编译器警告的方法,因为super.name
也可以工作。您尝试过重新编译吗将此作为错误移植到typescript?所有属性,而不仅仅是方法,都应该通过super
提供。我不知道它在哪里或是否说了什么,确切地说是什么。但它显然应该在编译器中进行更改,必要时还可能在规范中进行更改。抑制此错误不需要此破解。谢谢@MarcG,这是应该是公认的答案:)
class A {
protected _name: string = ""
set name(name: string) {
this._name = name
}
get name() {
return this._name
}
}
class B extends A {
// Removed _name declaration here
set name(name: string) {
super["name"] = name + "B" // <=== Using super here
}
get name() {
return super["name"] // <=== And here
}
}
var b = new B();
b.name = "foo";
console.log(b.name); // "fooB"