使用自调用函数javascript定义对象文字中的getter / setter

时间:2014-04-21 18:00:23

标签: javascript getter-setter

在定义对象文字时,可以使用自调用函数,以便函数可以访问私有变量,

obj={
    value:(function(){
        var private;
        return function(){
            return true;
        }
    }())
};

但是可以用对象文字中的getter / setter做同样的事情吗?

obj={
    get value(){
        return value;
    },
    set value(v) {
        value=v;
    }
};

3 个答案:

答案 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)