【问题标题】:How to return a constructor argument value from a getter function in ES6 Classes如何从 ES6 类中的 getter 函数返回构造函数参数值
【发布时间】:2015-08-16 20:11:29
【问题描述】:

例子:

class Person {
  constructor(name) {

  }

  get name() {
    return /* “name” argument from constructor */;    
  }
}

我希望name getter 返回传递给构造函数的name 值。

【问题讨论】:

  • 你不能。构造函数参数的作用域仍然是构造函数,在 ES6 中没有任何改变。

标签: javascript class ecmascript-6


【解决方案1】:

将参数保存到实例属性中:

class Person {
  constructor(name) {
    this.name_ = name;
  }

  get name() {
    return this.name_;
  }
}

Demo

【讨论】:

  • 如果我要使用中间变量,最好设置一个符号属性,但我希望有一个直接的解决方案。
  • 是的,我发布了最简单的答案,以避免不必要的过度设计。您可以使用符号或 WeakMaps 来尝试模拟私有变量,但最终归结为“如果未在公共 API 中记录,请自行承担使用风险”。
【解决方案2】:
class Person {
  constructor(name) {
    Object.defineProperty(this, 'name', {
      get() {
        return name;
      }
    });
  }
}

应该这样做:)(不漂亮,但是会这样做)

你可以做一个辅助函数:

function makeGetter(obj, prop, value) {
  Object.defineProperty(obj, prop, {
    return value;
  });
}

class Person {
  constructor(name) {
    makeGetter(this, 'name', name);
  }
}

更新:

您真正需要的只是以下内容(不敢相信我过于复杂了):

class Person {
  constructor(name) {
    this.name = name;
  }
}
var p = new Person('Edwin');
p.name; // returns 'Edwin'

p.name = 'Sime'; // Sets name
p.name; // returns 'Sime'

【讨论】:

  • 这提醒了我,为什么 ES6 没有给我们定义对象上的 getter 的糖语法? Object.defineProperty() 的东西太低级了。
  • 我不知道,但你可以在ES-Discuss提出建议
  • TC39 可能已经花了 10 个小时讨论提案,但无法就任何事情达成一致:)
  • 关于更新,这将使属性可写。
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 2016-09-16
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多