Javascript 重写setter,getter也必须被重写

Javascript 重写setter,getter也必须被重写,javascript,class,ecmascript-6,getter-setter,traceur,Javascript,Class,Ecmascript 6,Getter Setter,Traceur,重写属性的set方法,并且似乎get方法也必须被重写,否则将返回undefined(即,get方法不被继承,取消注释上面的子类get property()方法,一切正常) 我假设这是规范的一部分,但如果该行为是交叉编译的结果,则可能会发生。可以肯定的是,这是对重写的setter和getter进行编码的正确方法(两者同时进行还是完全不进行编码)?是的,这是有意的(规范的一部分)。如果对象有自己的属性(.property,在您的示例中),则将使用此属性,而不是继承的属性。如果该属性存在,但是没有ge

重写属性的
set
方法,并且似乎
get
方法也必须被重写,否则将返回
undefined
(即,
get
方法不被继承,取消注释上面的子类
get property()
方法,一切正常)

我假设这是规范的一部分,但如果该行为是交叉编译的结果,则可能会发生。可以肯定的是,这是对重写的setter和getter进行编码的正确方法(两者同时进行还是完全不进行编码)?

是的,这是有意的(规范的一部分)。如果对象有自己的属性(
.property
,在您的示例中),则将使用此属性,而不是继承的属性。如果该属性存在,但是没有getter的访问器属性,则将返回
未定义的


请注意,此行为与ES5没有改变。

您是否可以编辑示例,使setter/getter不仅仅调用super?这可能会有所帮助:。它从
\uuuu defineGetter\uuuu
等方面讨论了这个问题,但原理是一样的:如果要在已经有getter的属性上定义/重新定义setter,则需要检索getter并将其与setter一起重置。在
\uu defineGetter\uuuuu()之前,大约在ES5的同一时间切换到CoffeeScript
/setter永远不会被标准化。@Bergi出于好奇,如果您能指出规范中说明这一点的部分,我将不胜感激。我尝试搜索ES5和ES6规范,但它们似乎都没有明确说明任何关于重写getter或setter的内容。@brianpeiris:“重写”发生在中,从或通过调用(ES5的工作原理基本相同,但各自的规范部分可能更容易阅读)@brianpeiris:然后在评估属性访问或赋值时,And是相关的,它们都使用,而不关心是否定义了setter和getter,或者只定义了其中一个。这仍然正确吗?你能链接定义它的规范吗?
class AbstractClass {

    constructor() {
    }

    set property(value) {
        this.property_ = value;
    }

    get property() {
        return this.property_;
    }

}

class Subclass extends AbstractClass {

    constructor() {
        super();
    }

    set property(value) {
        super.property = value;
        if (!(this.property_ instanceof SubclassAssociatedClass)) throw new TypeError();
    }

    //get property() {
    //  return super.property;
    //}

}