在javascript中从基本对象创建动态getter和setter?
这是我的基本对象:在javascript中从基本对象创建动态getter和setter?,javascript,getter-setter,Javascript,Getter Setter,这是我的基本对象: let resources = { TEST_FLAG: false, FRUIT: 'banana', ID: 11 }; 我希望通过setter和getter访问该对象的每个属性。我试图做到以下几点: let dynamicResources = resources for (let key in resources) { Object.defineProperty(dynamicResources, key, { ge
let resources = {
TEST_FLAG: false,
FRUIT: 'banana',
ID: 11
};
我希望通过setter和getter访问该对象的每个属性。我试图做到以下几点:
let dynamicResources = resources
for (let key in resources) {
Object.defineProperty(dynamicResources, key, {
get() {
console.log(`[debug]: GET <${key}>, VALUE <${this[key]}>`);
return `${this[key]}`;
},
set(value) {
console.log(`[debug]: SET <${key}>, VALUE <${this[key]}>`);
this[key] = value;
}
});
}
这表明工厂循环已经工作。但是,当我这样做时:
dynamicResources.FRUIT = 'berry';
我得到以下错误:
set: function set(value) {
RangeError: Maximum call stack size exceeded
这表明嵌套函数的格式有点不正确
如何基于通用基本对象生成动态getter/setter对象?使用代理构造函数。指望
var dynamicObject=新代理{
TEST_标志:false,
水果:“香蕉”,
身份证号码:11
},{
get:functiontarget,key{
log`get${key}值。值为:${target[key]}`;
返回目标[键]
},
设置:函数目标、键、值{
log`set${key}值。旧值为:${target[key]}新值为${val}`
目标[键]=val;
返回true;
}
}
console.logdynamicObject.ID;
dynamicObject.ID=25;
//输出为:
/*
获取ID值。数值为:11
11
设置ID值。旧值为:11新值为25
*/ 使用代理构造函数。指望
var dynamicObject=新代理{
TEST_标志:false,
水果:“香蕉”,
身份证号码:11
},{
get:functiontarget,key{
log`get${key}值。值为:${target[key]}`;
返回目标[键]
},
设置:函数目标、键、值{
log`set${key}值。旧值为:${target[key]}新值为${val}`
目标[键]=val;
返回true;
}
}
console.logdynamicObject.ID;
dynamicObject.ID=25;
//输出为:
/*
获取ID值。数值为:11
11
设置ID值。旧值为:11新值为25
*/ 试着这样做:
让资源={
TEST_标志:false,
水果:“香蕉”,
身份证号码:11
};
让dynamicResources={
_状态:{…资源}
}
让我们输入资源{
Object.defineProperty动态资源,键{
得到{
常量internalKey=key
返回此。\u状态[internalKey]
},
设定值{
常量internalKey=key
此._状态[internalKey]=值;
}
};
}
console.logdynamicResources.FRUIT
dynamicResources.FRUIT='berry';
console.logdynamicResources.FRUIT像这样尝试:
让资源={
TEST_标志:false,
水果:“香蕉”,
身份证号码:11
};
让dynamicResources={
_状态:{…资源}
}
让我们输入资源{
Object.defineProperty动态资源,键{
得到{
常量internalKey=key
返回此。\u状态[internalKey]
},
设定值{
常量internalKey=key
此._状态[internalKey]=值;
}
};
}
console.logdynamicResources.FRUIT
dynamicResources.FRUIT='berry';
console.logdynamicResources.fruit如果得到无限递归,setter的this[key]=value语句将再次调用setter函数。要解决这个问题,请将该值存储到另一个属性并从中检索。正如@Titus所说,您并没有真正掌握JS中getter和setter的概念。您需要一个包含该值的单独属性。所有的能手和二传手都只是代理。你能告诉我们你的最终目标是什么吗?它不能创建控制台日志,对吗?也许有一种不同的方法可以达到这个目标。目标是能够只使用属性名来设置和获取值,比如foo.ID=33,foo.FRUIT='orange',foo.TEST_FLAG=false。但是我不想手动定义单独的setter和getter访问点,而是想用一个工厂函数来生成它们。因此,如果还有其他属性,那么这些属性也将具有setter和getter功能。要解决这个问题,请将该值存储到另一个属性并从中检索。正如@Titus所说,您并没有真正掌握JS中getter和setter的概念。您需要一个包含该值的单独属性。所有的能手和二传手都只是代理。你能告诉我们你的最终目标是什么吗?它不能创建控制台日志,对吗?也许有一种不同的方法可以达到这个目标。目标是能够只使用属性名来设置和获取值,比如foo.ID=33,foo.FRUIT='orange',foo.TEST_FLAG=false。但是我不想手动定义单独的setter和getter访问点,而是想用一个工厂函数来生成它们。因此,如果还有其他属性,那么这些属性也将具有setter和getter功能。这同样有效。感谢所有的输入,我将介绍这两种解决方案。是否有可能在代理中有一个方法,一个也可以调用的方法,例如:dynamicResources.locktrue?这也很有效。感谢所有的输入,我将介绍这两种解决方案。是否可以在代理中有一个方法,一个也可以调用的方法,例如:dynamicResources.locktrue?
set: function set(value) {
RangeError: Maximum call stack size exceeded