我应该如何在 ES6 实例中保留对 'options object' 的引用?

How should I keep a reference to 'options object' in a ES6 instance?

给定如下所示的 ES6 class,保持对传递到构造函数的数据的引用以便实例方法可以使用的最佳方法是什么?

到目前为止我发现的最好的方法是在构造函数中手动添加对每个实例的引用 属性。有cleaner/easier方法吗?

class Test {

  constructor( {
    option1 = 1,
    option2 = 2
  } = {} ) {

    // What's the best way to keep a reference to
    // the options on the instance?
    this.options = {
      option1,
      option2
    };
  }

  addOptions() {
    return this.options.option1 + this.options.option2;
  }
}

let t = new Test({
  option1: 5
});

console.log(t.addOptions()); // 7

这是通过 6to5 到 above code 运行 的 link。

既然你正在解构第一个参数并且没有命名引用,那么this.options = arguments[0]怎么样?

如果您不想让外部函数修改它,您可以将其深度冻结。

如果您希望它不可访问,请在模块范围内使用实例键控的 WeakMap 来隐藏它们。

要获取默认值,您可以改用它:

const defaults = {...}

function(options) {
  this.options = Object.assign({}, defaults, options)
  // now destructure to local vars as needed
  ...
}

注意:Object.assign 只是浅合并。

ES6 不允许在 class 声明中声明原型属性,这有点痛苦......但是,使用 getter 到 return 默认值可能会很好对于你的情况。也许尝试这样的事情:

class Test {
  get defaults() { return { option1: 1, option2: 2 }; }

  constructor(parameters) {
    this.options = Object.assign({}, this.defaults, parameters)
  }

  doSomething() {
    return this.options.option1 + this.options.option2;
  }
}

let test = new Test({
  option1: 5
});

console.log(test.doSomething());

这里是link到above code running on 6to5 REPL. If you want an example of merging defaults with inheritance, take a look at the constructor of this class