javascript - 如何为对象编写全局 get+set 方法
问题描述
我的问题很容易理解,我有一个对象(或类),我想要一个可以获取和设置属性的方法。
事实上,我为“简单”的属性写它是没有问题的。当我的类具有对象属性并且我想要访问或更改嵌套属性时,这变得很困难。
我的课:
var MyClass = function() {
this.name = 'defaultName';
this.list = {
a: 1,
b: 6
};
}
简单的课,不是吗?然后,我为我的方法写的内容:
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;
}
“获取部分”有效(MyClass.getset('list.b')
返回 6)。但是“设置部分”......不起作用。
我希望当我执行 时MyClass.getset('list.b', 2)
, 的b
属性list
变为 2,但事实并非如此。
我知道为什么我的版本不起作用(我的prop
变量只是一个“副本”并且不会影响对象本身),但我找不到解决方案......
谢谢你的帮助!
解决方案
如果您要分配原语,则需要分配给对象的属性以使对象也被更改。检查是否value
,如果是,则导航到并从倒数第二个属性更改,而不是最终属性。为简洁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'));
推荐阅读
- docker - 在 Docker 中,如何清理 X 时间未使用的卷/容器/等?(天、周、月?)
- javascript - 如何选择id包含的html元素
- android - App Bundle 构建失败:保留文件或目录错误
- python - 图片 (GIF) 不显示
- sql - SQL 合并 - 在结果输出中填充合并值的其他方法?
- c# - 在 C# 中读取 cheetah 模板化的 YAML 文件
- java - 应用强制关闭。短信广播接收器
- python - 在python中按升序读取文件夹编号
- angular - 防止 Angular2+ 始终更改浏览器 URL
- mql4 - MQL4:我们如何在文件之间分离一个类定义?