首页 > 解决方案 > 如何为对象编写全局 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变量只是一个“副本”并且不会影响对象本身),但我找不到解决方案......

谢谢你的帮助!

标签: javascriptjquerygetter-setter

解决方案


如果您要分配原语,则需要分配给对象的属性以使对象也被更改。检查是否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'));


推荐阅读