覆盖一个 setter,并且 getter 也必须被覆盖

IT技术 javascript class ecmascript-6 getter-setter traceur
2021-03-15 20:29:05
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;
    //}

}

覆盖set一个属性方法,看起来该get方法也必须被覆盖,否则undefined返回(即该get方法未被继承,取消get property()上面的子类方法的注释,一切正常)。

我认为这是规范的一部分,如果行为是交叉编译的结果,它可能会遵循。可以肯定的是,这是编写覆盖的 setter 和 getter(同时或根本不)的正确方法吗?

1个回答

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

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

这仍然正确吗?你能链接定义它的规范吗?
2021-04-27 20:29:05
@brianpeiris:然后在评估属性访问或赋值时,[[Get]][[Set]]是相关的,它们都使用[[GetOwnPoperty]]不关心是否定义了 setter 和 getter 或仅定义了其中一个.
2021-05-01 20:29:05
与 ES5 大约在同一时间切换到 CoffeeScript,在此之前.__defineGetter__()/ setter 永远不会被标准化。
2021-05-09 20:29:05
@brianpeiris:“覆盖”发生在[[DefineOwnProperty]],从文字属性定义或通过调用Object.defineProperty(ES5 的工作原理基本相同,尽管各自的规范部分可能更容易阅读)
2021-05-10 20:29:05
@Bergi 出于好奇,如果您能指出说明这一点的规范部分,我将不胜感激。我尝试搜索 ES5 和 ES6 规范,但它们似乎都没有明确说明关于覆盖 getter 或 setter 的任何内容。
2021-05-14 20:29:05