我仍然不觉得我完全理解Object.defineProperties的使用,所以我很欣赏以下(有些人为的)例子的一些输入:
my_val
和one
的{{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中那样分配它的原因是,当您希望defineProperties
,writable
或enumerable
为假时;基本上它是为了控制。否则简单的configurable
定义是相同的,对吗?
this.property
和my_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的原因,因为我觉得我还没有很好地处理这个概念。
答案 0 :(得分:1)
my_val对于一个和两个
的行为相同
是
my_val对于三个和四个
的行为相同
不 - 有__my_val
。您至少可以考虑使用本地范围的“私有”变量而不是公共属性。
使用get / set函数而不仅仅是值的原因是当你想要添加更多高级逻辑时,例如在更新my_val时调用另一个函数,或者发送事件等等。
是的,这就是getters/setters的目的。
你也不能在没有至少定义初始值的情况下使用get / set(通过此处显示的value属性,或通过简单的this.property = ...定义,如1),是否正确?
不,你也可以简单地留下undefined
。