Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储ES6 Javascript类';调用继承时的s getter/setter_Javascript_Ecmascript 6_Prototype - Fatal编程技术网

存储ES6 Javascript类';调用继承时的s getter/setter

存储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,如果我的逻辑改变了它 我需要存储对其中一个类

编辑:我执行以下过程的原因是为了将对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);
这显然破坏了我的方法,因为一部分需要
\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对象可能会被大量创建/删除。当然,这看起来像是一种危险的模式,通常我会建议远离这些技巧,除非你同意