澄清Javascript Object.defineProperties的用法



我仍然不完全理解Object.defineProperties的使用,所以我很感激对以下(有些人为的)示例的一些输入:


1.my_val在以下代码中对onetwo的行为相同:

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");

使用defineProperties而不是像在Class_1中那样只分配它的理由是,当你希望writableenumerableconfigurable为假时;基本上是为了控制。否则,简单的this.property定义是相同的,对吗?


2.my_val在以下代码中对threefour的行为相同:

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的理由是,当您想要添加更高级的逻辑时,比如在my_val更新时调用另一个函数,或者发送事件等。此外,如果不至少定义初始值(通过此处显示的value属性或通过1中的简单this.property = ...定义),就不能使用get/set,对吗?


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

my_val对一个和两个的行为相同

是。

my_val对三个和四个的行为相同

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

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

是的,这就是getter/setter的用途。

此外,如果不至少定义初始值,就不能使用get/set(通过此处显示的value属性,或通过1中的简单this.properties=…定义),对吗?

不,您也可以将其保留为undefined

最新更新