我仍然不完全理解Object.defineProperties的使用,所以我很感激对以下(有些人为的)示例的一些输入:
1.my_val
在以下代码中对one
和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");
使用defineProperties
而不是像在Class_1中那样只分配它的理由是,当你希望writable
、enumerable
或configurable
为假时;基本上是为了控制。否则,简单的this.property
定义是相同的,对吗?
2.my_val
在以下代码中对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
的理由是,当您想要添加更高级的逻辑时,比如在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
。