簡體   English   中英

涉及繼承時存儲ES6 Javascript類的getter / setter

[英]Storing an ES6 Javascript class's getter/setter when inheritance is involed

編輯 :我正在執行以下過程的原因是,這樣我就可以將對getter / setter的引用存儲在字典中。 這使我可以將字典的鍵作為HTML元素的ID。 因此,如果在HTML中更改了屬性,則可以執行以下操作:

var propData = allMyGetterSetters[e.originalTarget.id];
propData.getSet.set(propData.obj, e.originalTarget.value);

如果我的邏輯對其進行了更改,這還允許我執行循環並更新所有HTML。


我需要存儲對一個類的一些屬性的getter / setter的引用。 我已經用下面的代碼做到了:

Object.getOwnPropertyDescriptor(Object.getPrototypeOf(myClassObj.position), "x");

為簡單起見,由於必須多次執行此操作,因此有以下方法:

_makeGetSetObj(object, property){
    return {
        getSet: Object.getOwnPropertyDescriptor(Object.getPrototypeOf(object), property),
        obj: object
    };
}

隨后的代碼如下所示:

var xPos = this._makeGetSetObj(myClassObj.position, "x");
// ...
xPos.getSet.get(xPos.obj);

所有這些完美地工作。

但是,我現在需要存儲對myclassObj對象的getter / setter的myclassObj 但是,以下方法不起作用

this._makeGetSetObj(myClassObj, "name");

這實際上給了我一個錯誤,該name在對象上不存在。 我設法弄清楚問題是我的繼承,看起來像這樣

|-- BaseClass
  |-- MyClass
    |-- DerivedClass

問題似乎是myClassObj實際上是DerivedClass類型的對象,該對象上沒有屬性name

因此,如果我這樣做:

this._makeGetSetObj(myClassObj.__proto__, "name");

它可以獲取原型,但是當我嘗試如上所示(以我的xPos示例)使用它時,它失敗了,因為它似乎仍然在obj中將引用存儲為DerivedClass對象。

如果我退出方法,然后手動嘗試操作,則可以這樣做:

var name = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(myClassObj.__proto__), "name");
name.get(myClassObj);

這顯然破壞了我的方法,因為一部分需要__proto__而另一部分則不需要。

所以,我的問題是:有沒有辦法保持當前的邏輯,還是我必須為存在上述問題的場所創建一種特殊的方法?

謝謝。

硬編碼的原型不好聞。 原型鏈應該始終被迭代:

let proto = obj;
let descriptor;
do {
  descriptor = Object.getOwnPropertyDescriptor(proto, prop);
} while (!descriptor && proto = Object.getPrototypeOf(proto))
...

Reflect已經實現了此功能。 代替手動解析描述符,它可能是

const getSet = {
  get: () => Reflect.get(obj, prop),
  set: (val) => { Reflect.set(obj, prop, val) }
};

要不就

const getSet = {
  get: () => obj[prop],
  set: (val) => { obj[prop] = val }
};

因為這是直接調用訪問器時發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM