存储ES6 Javascript类';调用继承时的s getter/setter
编辑:我执行以下过程的原因是为了将对getter/setter的引用存储在字典中。这允许我将字典的键设置为HTML元素的ID。因此,如果在HTML中更改了属性,我可以执行以下操作:存储ES6 Javascript类';调用继承时的s getter/setter,javascript,ecmascript-6,prototype,Javascript,Ecmascript 6,Prototype,编辑:我执行以下过程的原因是为了将对getter/setter的引用存储在字典中。这允许我将字典的键设置为HTML元素的ID。因此,如果在HTML中更改了属性,我可以执行以下操作: var propData = allMyGetterSetters[e.originalTarget.id]; propData.getSet.set(propData.obj, e.originalTarget.value); 这也允许我做一个循环并更新所有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);
这显然破坏了我的方法,因为一部分需要\uuuu proto\uuuu
,而另一部分不需要
所以,我的问题是:有没有办法保持我目前的逻辑,或者我必须为描述问题的地方创建一个特殊的方法
谢谢。硬编码原型闻起来不太好。应始终迭代原型链:
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 }
};
因为这是直接调用访问器时发生的情况。硬编码原型闻起来不太好。应始终迭代原型链:
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 }
};
因为直接调用访问器时会发生这种情况。什么是“将句柄存储到getter/setter”呢?你想解决什么问题?@jfriend00正是我在代码片段中展示的。也许“参考”是一个更好的词?它似乎有效。试试这把小提琴直接呼叫访问者的目的不清楚,你能进一步解释你的情况吗?访问者的存在正是为了使这个过程透明。@TolgahanAlbayrak,阅读完整的问题。这涉及到继承,这会把事情搞砸。“将句柄存储到getter/setter”是什么意思?你想解决什么问题?@jfriend00正是我在代码片段中展示的。也许“参考”是一个更好的词?它似乎有效。试试这把小提琴直接呼叫访问者的目的不清楚,你能进一步解释你的情况吗?访问者的存在正是为了使这个过程透明。@TolgahanAlbayrak,阅读完整的问题。这涉及到遗传问题,把事情搞砸了。哇,这比我做的要干净得多!现在我有点恼火,因为我在研究如何使用
Reflect
时,没有找到任何关于使用Reflect的信息。作为旁注,我之所以不迭代是因为我不想要所有的属性。有些只用于代码中。是的,我们在ES6中有它。不清楚为什么需要使用这样的“dictionary”,但应该注意的是,存储对DOM中任意内容的引用是内存泄漏的直接方式。使用dictionary的原因是我可以在输入字段上有一个事件,当值发生变化时,它会让我知道,然后可以查找和修改新值。除了更干净的代码外,这还允许我通过修改两个地方(1.添加HTML框,2.添加允许JS查找并获取/设置值的行)来修改连接到系统中的内容。关于内存泄漏,这一点非常好。这种方法有风险吗?如果是这样的话,我该如何清理自己,因为dictionary对象可能会被大量创建/删除。当然,这看起来像是一种危险的模式,通常我建议不要使用这些技巧,除非你知道自己做得很好。为了更安全地防止泄漏,WeakMap可用于存储引用。哇,这比我刚才做的要干净得多!现在我有点恼火,因为我在研究如何使用Reflect
时,没有找到任何关于使用Reflect的信息。作为旁注,我之所以不迭代是因为我不想要所有的属性。有些只用于代码中。是的,我们在ES6中有它。不清楚为什么需要使用这样的“dictionary”,但应该注意的是,存储对DOM中任意内容的引用是内存泄漏的直接方式。使用dictionary的原因是我可以在输入字段上有一个事件,当值发生变化时,它会让我知道,然后可以查找和修改新值。除了更干净的代码外,这还允许我通过修改两个地方(1.添加HTML框,2.添加允许JS查找并获取/设置值的行)来修改连接到系统中的内容。关于内存泄漏,这一点非常好。这种方法有风险吗?如果是这样的话,我该如何清理自己,因为dictionary对象可能会被大量创建/删除。当然,这看起来像是一种危险的模式,通常我会建议远离这些技巧,除非你同意