当涉及继承时,存储ES6 Javascript类的getter/setter
Storing an ES6 Javascript class's getter/setter when inheritance is involed
Edit:我做以下处理的原因是我可以将对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的引用。但是,下面的
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 }
};
相关文章:
- javascript、量角器和类的问题
- 使用svg和javascript将一个类的元素动画化为另一个类
- javascript addClass没有'似乎没有触发类的css
- 使用Javascript从整个网页中删除具有特定类的所有span标记
- 在Javascript中对类的每个实例调用一个方法
- 什么's当前命名空间/类中JavaScript子命名空间/类的语法
- html类名中的数字形式的Javascript变量值
- 传递参数的Javascript类
- 多个类上的Javascript onclick事件处理程序
- 类的 JavaScript 实例
- 当名称以数字开头时,库/类的 javascript 约定是什么
- 拦截或覆盖类的javascript函数
- 在多个文件中拥有多个类的Javascript快速方法
- 用父属性实例化子类的Javascript
- 访问表td中的类的Javascript
- 类的Javascript注入
- 如何反序列化未知派生类的JavaScript对象
- 在没有类的JavaScript(不是jQuery)中切换display:none到all标签:是否可能?
- 用于链接和链接类的Javascript正则表达式
- 下拉菜单-要显示的类的Javascript:如果选项卡类打开或关闭,则为none(可折叠面板)