Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript B扩展A:在B中设置将覆盖get_Javascript_Typescript_Ecmascript 6_Getter Setter - Fatal编程技术网

Javascript B扩展A:在B中设置将覆盖get

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

打字稿:

在已编译的类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.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"