gpt4 book ai didi

javascript - 覆盖使用 Object.defineProperty 创建的 getter/setter

转载 作者:行者123 更新时间:2023-12-03 01:00:51 25 4
gpt4 key购买 nike

我遇到了一个问题,即通过 Object.defineProperty 添加到对象的属性出现错误。

有问题的错误。

Exception: RangeError: Maximum call stack size exceeded
<小时/>

也许(可能)我的设计不正确,我应该做一些不同的事情。这就是我打算用下面的代码做的事情:

  • 通过工厂函数创建对象 P。
  • 将配置对象 C 传递给工厂以自定义 P。
  • 将 C 作为私有(private)对象存储在 P 中,并通过 Object.defineProperty 将其属性附加到 P 来获取/设置 C 的值。对于任何给定的 P,C 可能不同。
  • 当我想覆盖某些 C.a 的默认 get/set 方法时,问题就出现了

我这样做:

// Create P with a custom (non-default) get method.
let C = { a: 1, b: 2, c: 3 };
let P = factory.createObject(C);

const customGetA = function(object, property) {
return function() {
if(!object[property])
object[property] = ' ';
return object[property];
};
};

P.customgGetMethod('a', customGetA);

// Looking at object in the console reveals the error mentioned above.
<小时/>
let factory = (function() {
'use strict';

this.createObject = function(config) {
const product = {};

let C = config;

// Add default getters/setters to the product, referencing the properties of C.
for (const property in config) {
Object.defineProperty(product, property, {
get: function() {
return C[property];
},
set: function(value) {
C[property] = value;
},
configurable: true,
enumerable: true
});
}

product.customGetMethod = function(property, callback) {
// Get the property description.
let descriptor = Object.getOwnPropertyDescriptor(this, property);

// Assign the custom get method within the callback, binding its values via closure.
descriptor.get = callback(this, property);

// Redefine the property with the new get method.
Object.defineProperty(this, property, descriptor);
};

return product;
};
})();

最后,我希望 a 能够将自定义数据对象传递给 P 并使其保持私有(private),并根据该数据动态生成 get/set 方法,这样我就不必获取/设置锅炉N-特性 * M-产品的板。这可能不是最好的设计或实现,但我不知道如何以另一种方式做到这一点。

任何替代方案或见解将不胜感激。

最佳答案

customGetAP.customgGetMethod('a', customGetA); 中创建的 getter 函数本质上是

function() {
if(!product.a)
product.a = ' ';
return product.a;
}

当我们将其与工厂中创建的默认 getter 进行比较时

function() { 
return C.a;
}

我们可以看到新的查找的是product中的值,而不是配置C。在 product 中查找属性会评估其 getter,这是我们已经所在的函数,它会递归直到最终溢出堆栈...

我认为您正在寻找

// Assign the custom get method within the callback, binding its values via closure.
descriptor.get = callback(C, property);
// ^

关闭内部配置对象。

关于javascript - 覆盖使用 Object.defineProperty 创建的 getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com