Javascript ES6:从类/函数中解构方法?

Javascript ES6:从类/函数中解构方法?,javascript,ecmascript-6,Javascript,Ecmascript 6,我想知道是否可以从类或函数的实例中解构属性/方法,同时保持跨解构变量的范围?例如: function Counter() { this.state = {count: 0} this.update = (fragment) => { this.state = Object.assign({}, this.state, fragment) } this.increment = () => { this.update({count: this.state.

我想知道是否可以从类或函数的实例中解构属性/方法,同时保持跨解构变量的范围?例如:

function Counter() {
  this.state = {count: 0}
  this.update = (fragment) => {
    this.state = Object.assign({}, this.state, fragment)
  }
  this.increment = () => {
    this.update({count: this.state.count + 1})
  }
  this.decrement = () => {
    this.update({count: this.state.count - 1})
  }
}

const counter = new Counter

const {
  state,
  increment,
  decrement
} = counter

console.log(state)
increment()
console.log(state)
decrement ()
console.log(state)

每个console.log的结果都是相同的:
{count:0}
,因为它正在为每个变量创建新实例和新范围


这是故意的吗?我是不是走错了路?(我正在创建一个库,我假设有人会尝试以这种方式使用它,所以我想让它工作起来)

在您的示例中,将desugars分解为

const state = counter.state;

将新值分配给
计数器。状态
不会神奇地更新
状态
的值。解构不会改变这一点。

在您的示例中,将desugars解构为

const state = counter.state;

将新值分配给
计数器。状态
不会神奇地更新
状态
的值。解构不会改变这一点。

它按预期工作。“我想有人会尝试这样使用它,所以我想让它工作”——你最好不要这样。实际上,这是一个关于JS“基本”行为的非常好的问题+1它按预期工作。“我想有人会尝试这样使用它,所以我想让它工作”——你最好不要这样。实际上,这是一个关于JS“基本”行为的非常好的问题+1.