请考虑以下内容:
class Base {
_value;
constructor() {
this._value = 1;
}
get value() { return this._value; }
set value(v) { this._value = v; }
}
class Derived extends Base {
set value(v) {
// ...
super.value = v;
}
}
const d = new Derived();
d.value = 2;
console.log(d.value); // <-- undefined
我希望Base
类的“ getter”方法在Derived
类中是“继承”,因此显示2
的值而不是[C0 ]。似乎“ [getter”或“ setter”方法都是独立继承的,而被统称为单个实体。从某种意义上说,如果不存在重写的setter方法,或者将其与相应的getter(在派生类中专门声明,而不是被继承)结合,如下所示:undefined
那么就不会有这样的问题。
所以,为什么getter或setter不能独立继承,因为它们应该使概念分离?
请考虑以下内容:类Base {_value; builder(){this._value = 1; } get value(){return this._value; }设置值(v){this._value = v; }}类...
get value() { return super.value; }
包含您在Derived.prototype
中指定的value
的前驱描述符。这就是JavaScript的工作方式。Object.defineProperty(Derived.prototype, "value", {
get: Object.getOwnPropertyDescriptor(Base.prototype, "value").get,
set: Object.getOwnPropertyDescriptor(Derived.prototype, "value").set
});
连接到父级Constructor.prototype
以进行委派。通常,也调用Constructor.prototype
构造函数。这些步骤形成了单祖先的父/子层次结构,并创建了OO设计中可用的最紧密的耦合。