我已经看到了在模块模式中实现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;
}());
答案 0 :(得分:2)
使用getter syntax创建一个属性,在ES2015之前,您必须知道编写代码时的名称。
Object.defineProperty
允许您执行与上述相同的操作,但即使在ES2015之前,也不需要您知道高级属性的名称。它还允许您决定属性是可配置的,可枚举的还是可写的,这是使用get/set
语法无法实现的。
回答你的确切问题:两者都没有更好。它们适用于不同的情况。 get/set
语法更易于读写,但不如Object.defineProperty
强大。
答案 1 :(得分:0)
如文档中所述。
通过赋值添加正常属性会创建在属性枚举期间显示的属性(对于... in循环或Object.keys方法),其值可能会更改,并且可能会被删除。此方法允许从默认值更改这些额外的详细信息。默认情况下,使用Object.defineProperty()添加的值是不可变的。
答案 2 :(得分:-1)
一个优点" Object.defineProperty与get / set表示法的关系是,defineProperty可以在任何时候使用,甚至可以在已经创建的对象上使用(在这些对象上你不能使用速记' get'表示法)。来自mdn:
To append a getter to an existing object later at any time, use Object.defineProperty().