![](/img/trans.png)
[英]Javascript, extending ES6 class setter will inheriting getter
[英]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.