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

TypeScript: view on playground

class A {
    protected _name: string = ""

    set name(name: string) {
        this._name = name
    }   
    get name() {
        return this._name
    }
}

class B extends A {
    protected _name: string = ""

    set name(name: string) {
        this._name = name + "B"
    }
}

在编译的类B中,这将覆盖集合AND的定义:

Object.defineProperty(B.prototype, "name", {
    set: function (name) {
        this._name = name + "B";
    },
    enumerable: true,
    configurable: true
});

结果是,获取名称在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"

与@Crowder代码的唯一区别在于,我使用super [“name”]而不是super.name.如果使用super.name,编译器将发出此错误:只能通过’super’关键字访问基类的公共和受保护方法.请注意:TypeScript在发现错误时仍会编译,因此使用super.name也可以正常工作,尽管有错误.

点赞