Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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
在javascript中从基本对象创建动态getter和setter?_Javascript_Getter Setter - Fatal编程技术网

在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