为什么getter或setter不能在JavaScript中独立继承?

问题描述 投票:2回答:2

请考虑以下内容:

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; }}类...

javascript oop inheritance getter-setter
2个回答
-3
投票
Acessor描述符具有一个getter和一个setter。没有acessor描述符,就不能有getter / setter。 get value() { return super.value; } 包含您在Derived.prototype中指定的value的前驱描述符。这就是JavaScript的工作方式。

-3
投票
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设计中可用的最紧密的耦合。
© www.soinside.com 2019 - 2024. All rights reserved.