如何为对象编写一个全局的get+set方法
How to write a global get+set method for object
我的问题很容易理解,我有一个对象(或class),我想有一个方法可以获取和设置一个属性。
其实我写给"simple"属性没问题。当我的 class 具有对象属性并且我想访问或更改嵌套的属性时,这就变得困难了。
我的class:
var MyClass = function() {
this.name = 'defaultName';
this.list = {
a: 1,
b: 6
};
}
简单 class,不是吗?然后,我为我的方法写了什么:
MyClass.prototype.getset = function(prop) {
let value = arguments[1];
let path = prop.split('.');
prop = this;
$(path).each(function(i) { prop = prop[this]; }
if (value) {
prop = value;
return this;
}
return prop;
}
"get part" 有效(MyClass.getset('list.b')
returns 6)。
但是 "set part"... 不起作用。
我想在执行MyClass.getset('list.b', 2)
的时候,list
的b
属性变成2,不是这样的
我知道为什么我的版本不起作用(我的 prop
变量只是一个 "copy" 并且不影响对象本身),但是我找不到解决方案...
感谢您的帮助!
如果您要分配基元,则需要分配给对象的 属性 以便对象也被更改。检查是否 value
,如果是,则导航至 next 并将其更改为最后一个 属性,而不是最后一个 属性。为简洁起见,使用 reduce
:
var MyClass = function() {
this.name = 'defaultName';
this.list = {
a: 1,
b: 6
};
}
MyClass.prototype.getset = function(prop, value) {
const props = prop.split('.');
const lastProp = props.pop();
const lastObj = props.reduce((obj, prop) => obj[prop], this);
if (value) {
lastObj[lastProp] = value;
return this;
} else return lastObj[lastProp];
}
const mc = new MyClass();
mc.getset('list.b', 2);
console.log(mc.list.b);
console.log(mc.getset('list.b'));
我的问题很容易理解,我有一个对象(或class),我想有一个方法可以获取和设置一个属性。
其实我写给"simple"属性没问题。当我的 class 具有对象属性并且我想访问或更改嵌套的属性时,这就变得困难了。
我的class:
var MyClass = function() {
this.name = 'defaultName';
this.list = {
a: 1,
b: 6
};
}
简单 class,不是吗?然后,我为我的方法写了什么:
MyClass.prototype.getset = function(prop) {
let value = arguments[1];
let path = prop.split('.');
prop = this;
$(path).each(function(i) { prop = prop[this]; }
if (value) {
prop = value;
return this;
}
return prop;
}
"get part" 有效(MyClass.getset('list.b')
returns 6)。
但是 "set part"... 不起作用。
我想在执行MyClass.getset('list.b', 2)
的时候,list
的b
属性变成2,不是这样的
我知道为什么我的版本不起作用(我的 prop
变量只是一个 "copy" 并且不影响对象本身),但是我找不到解决方案...
感谢您的帮助!
如果您要分配基元,则需要分配给对象的 属性 以便对象也被更改。检查是否 value
,如果是,则导航至 next 并将其更改为最后一个 属性,而不是最后一个 属性。为简洁起见,使用 reduce
:
var MyClass = function() {
this.name = 'defaultName';
this.list = {
a: 1,
b: 6
};
}
MyClass.prototype.getset = function(prop, value) {
const props = prop.split('.');
const lastProp = props.pop();
const lastObj = props.reduce((obj, prop) => obj[prop], this);
if (value) {
lastObj[lastProp] = value;
return this;
} else return lastObj[lastProp];
}
const mc = new MyClass();
mc.getset('list.b', 2);
console.log(mc.list.b);
console.log(mc.getset('list.b'));