如何为对象编写一个全局的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)的时候,listb属性变成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'));