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;
//}
}