在定义对象文字时,可以使用自调用函数,以便函数可以访问私有变量,
obj={
value:(function(){
var private;
return function(){
return true;
}
}())
};
但是可以用对象文字中的getter / setter做同样的事情吗?
obj={
get value(){
return value;
},
set value(v) {
value=v;
}
};
答案 0 :(得分:8)
不是真的。您也可以为obj
创建一个IIF:
obj = function () {
var privatething = 'hithere';
return {
get value() {
return privatething;
},
set value(v) {
privatething = v;
}
};
}();
obj.value; //=> 'hithere';
obj.value = 'good morning to you too';
obj.value; //=> 'good morning to you too'
答案 1 :(得分:0)
这很有效。
var obj = {a:1};
console.log(obj.a); //1
Object.defineProperty(obj,"a",{
get: function(){
return this.b;
},
set: function(x){
this.b = x;
},
configurable:true,
});
obj.a = 10;
console.log(obj); //10
for(var key in obj)
{
console.log(key)
}
如果您不希望在使用b
循环或for...in
时枚举属性Object.keys()
,只需添加该行
Object.defineProperty(obj,"b",{enumerable:false})
注意:上面的代码也可以用作侦听器,以检测属性值的变化。 (在设置值后,通过set
方法实现所需的功能。)
var obj = {a:1};
console.log(obj.a); //1
Object.defineProperty(obj,"a",{
get: function(){
return this.b;
},
set: function(x){
this.b = x;
console.log("obj.a value has been changed to "+x);
},
configurable:true,
});
obj.a = 10;
obj.c = 20;
obj.a = 30;
答案 2 :(得分:0)
按照ES6和更高版本的样式,还可以在签名中设置默认值。
const _ = function(_x = 'leafy greens', _y = 'chicken', _z = 'noodle soup') {
// console.log(_x)
return {
_x,
_y,
_z,
get x() { return this._x },
set x(value) { this._x = value }
}
}()
console.log(_.x)
_.x = 'beef & pork'
console.log(_.x)