模块模式中 get/set 和 Object.defineProperty 的区别

Sky*_*ler 6 javascript module-pattern

我已经看到了在模块模式中实现 getter/setter 的两种不同方法。一个使用“defineProperty”,而另一个则不使用。一种与另一种相比有哪些优点/缺点?

var MyModule = (function() {

  var _val;

  var api = {
    get value1() {
      return _val
    },
    set value1(value) {
      _val = value
    }
  };

  Object.defineProperty(api, 'value2', {
    get: function() {
      return _val;
    },
    set: function(value) {
      _val = value
    }
  });
  return api;

}());
Run Code Online (Sandbox Code Playgroud)

https://plnkr.co/edit/TbJSD4noZTew8II83eTH?p=preview

Mik*_*uck 5

使用getter 语法创建一个属性,在 ES2015 之前,您必须在编写代码时知道该属性的名称。

Object.defineProperty允许您执行与上面相同的操作,但即使在 ES2015 之前,也不要求您提前知道属性的名称。它还允许您决定属性是否可配置、可枚举或可写,而使用get/set语法是不可能的。

回答你的确切问题:两者都不是更好。它们适用于不同的情况。该get/set语法更易于阅读和编写,但不如Object.defineProperty.