2

我需要向列表中添加新对象(Filters.list)
* Filters.prop - 是默认道具
* 列表项也有道具 - list[name].prop (等于默认道具)

chage default Filters.prop -> [not] change item list[name].prop
哪里出错了?

function Filters() {
  this.prop = 'some';  
  this.list = { };
  
  this.add = function (name) {
    this.list[name] = {
      prop: this.prop,
    };
  }
} 
 
let attempt = new Filters();
attempt.add('first');
attempt.prop = 'other';

document.writeln(attempt.prop);
document.writeln(attempt.list['first'].prop);

运行片段输出后:其他一些
但我需要:其他其他

我认为该属性将通过引用保存。但事实并非如此,它没有改变。当我更改Filters.prop我希望它也会更改list[name].prop

4

1 回答 1

2

这样做的问题是,正如您自己注意到的那样,值是以您执行它的方式而不是引用的方式传递的。

多亏了JavaScript get,您可以prop在行为类似于属性的函数中返回周围对象的值。

function Filters() {
  this.prop = 'some';  
  this.list = { };
  
  this.add = function(name) {
    let self = this;
    this.list[name] = {
      get prop() {
        return self.prop;
      },
    };
  }
}

let attempt = new Filters();
attempt.add('first');
attempt.prop = 'other';

document.writeln(attempt.prop)
document.writeln(attempt.list['first'].prop)

旁注:我在self这里使用变量是因为使用this.propwithinget prop()会引用错误的对象并因此导致递归。

于 2018-06-06T11:40:59.237 回答