gpt4 book ai didi

javascript - 在对象构造函数中以编程方式定义 Javascript 属性

转载 作者:行者123 更新时间:2023-11-29 18:23:04 27 4
gpt4 key购买 nike

我有一个 Javascript 构造函数,其中包含一个包含其所有字段的对象,以及读取/写入它们的函数:

function myObj(){
var _settingsStore {
setting1: 1, //default value
setting2: 2, //default value
}

//gets/sets _settingsStore.settingName, does other stuff
function _genericSet(settingName, settingValue){}
function _genericGet(settingName){}

我想以编程方式围绕每个字段创建属性:

    for (var _setting in _settingsStore){
var _str = _setting.toString();
Object.defineProperties(this, {
_str: {
get: function() {return _genericGet(_str)},
set: function(value) {return _genericSet(_str, value)}
}
})
}

我的意图是让 _str 成为一个纯粹的变量,并且应该定义 myObj.setting1myObj.setting2。相反,循环尝试定义 myObj._str 两次:

Uncaught TypeError: Cannot redefine property: _str

这是怎么回事?有没有办法获得我想要的行为?

编辑:澄清一下,这是我实际上想要发生的事情,只是在循环之外展开:

Object.defineProperties(this, {
settings1: {
get: function() {return _genericGet("settings1")},
set: function(value) {return _genericSet("settings1", value)}
},
settings2: {
get: function() {return _genericGet("settings2")},
set: function(value) {return _genericSet("settings2", value)}
},
//and so on, if there are more of them
})

最佳答案

我要重新开始了。如果您只想使用 setter 和 getter 做一些额外的工作,并且每个对象都在构造函数中隐藏了它的存储,并且您想重用一些通用函数,您可以这样做:

function myObj(){
var _settingsStore = {
setting1: 1, //default value
setting2: 2, //default value
}

for (var _setting in _settingsStore){
makeGetSet(this, _setting, _settingStore);
}
}

function makeGetSet(obj, key, store) {
Object.defineProperty(obj, key, {
get: function() { return _genericGet(key, store)}
set: function(val) {_genericSet(key, val, store)}
})
}

function _genericGet(key, store){
var val = store[key];
// manipulate the val
return val
}
function _genericSet(key, val, store){
// manipulate the new val
store[key] = val
}

我真的不知道你在获取/设置时做了什么样的操作,所以其中一些可能会被缩短。

此外,您可以使 _settingsStore 通用,并且只使用变量范围来存储值,因为无论如何您都需要它。

关于javascript - 在对象构造函数中以编程方式定义 Javascript 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16445829/

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