澄清Javascript Object.defineProperties的用法

时间:2014-02-19 16:24:46

标签: javascript object properties

我仍然不觉得我完全理解Object.defineProperties的使用,所以我很欣赏以下(有些人为的)例子的一些输入:


1。以下代码中my_valone的{​​{1}}行为相同:

two

使用var Class_1 = function (arg) { this.my_val = arg; }; var Class_2 = function (arg) { Object.defineProperties(this,{ my_val : { value : arg, writable : true, enumerable : true, configurable : true } }); }; var one = new Class_1("foo"); var two = new Class_2("foo"); 而不是像在Class_1中那样分配它的原因是,当您希望definePropertieswritableenumerable为假时;基本上它是为了控制。否则简单的configurable定义是相同的,对吗?


2。以下代码中this.propertymy_val的{​​{1}}行为相同:

three

使用four / var Class_value = function (arg) { Object.defineProperties(this, { my_val : { value : arg, writable : true, // enumerable : false // default // configurable : false // default } }); }; var Class_getSet = function (arg) { Object.defineProperties(this, { __my_val : { value : arg, writable : true, // enumerable : false // default // configurable : false // default }, my_val : { get : function(){ return this.__my_val; }, set : function(new_val){ this.__my_val = new_val; } } }); }; var three = new Class_value("foo"); var four = new Class_getSet("foo"); 函数而不只是get的原因是,当您想要添加更多高级逻辑时,例如在set更新时调用另一个函数或者发送事件等。另外,如果不至少定义初始值(通过此处显示的value属性或通过简单{{1},则无法使用my_val / get定义如 1。),对吗?


基本上我只是想确保我理解如何以及何时使用defineProperties的原因,因为我觉得我还没有很好地处理这个概念。

1 个答案:

答案 0 :(得分:1)

  

my_val对于一个和两个

的行为相同

  

my_val对于三个和四个

的行为相同

不 - 有__my_val。您至少可以考虑使用本地范围的“私有”变量而不是公共属性。

  

使用get / set函数而不仅仅是值的原因是当你想要添加更多高级逻辑时,例如在更新my_val时调用另一个函数,或者发送事件等等。

是的,这就是getters/setters的目的。

  

你也不能在没有至少定义初始值的情况下使用get / set(通过此处显示的value属性,或通过简单的this.property = ...定义,如1),是否正确?

不,你也可以简单地留下undefined