首页 > 感觉Object.defineProperty 的设计有点繁琐啊

感觉Object.defineProperty 的设计有点繁琐啊

get set 不能和value同时使用。
那么就是说 get和set的时候都是在操作别人,不能操作自己。多了一个别人

var book={}

我想像中的用法:

Object.defineProperty(book,"year",{
    value:2014,
    get: function() {
        return this.year;
    },
    set: function(value) {
       this.year=value;
    }
});

这么多么节约内存啊。。操作的是自己,操作自己,操自己。。

而现实是:

目前的用法:

var book = {
    _year: 2014,
};
Object.defineProperty(book,"year",{
    get: function() {
        return this._year;
    },
    set: function(value) {
       this._year=value;
    }
});

操作的是别人,操作别人,操别人。。

如果key超级多,那么需要为每个key额外增加对应的操作器。。。

var book = {
    _year1: 2014,
    _year2: 2014,
    _year3: 2014,
    _year4: 2014,
    _year5: 2014,
    _year6: 2014,
    _year7: 2014,
    ... ....
};

是不是不太合理。。? 能写个函数统一处理吧?能的话 也是多个函数啊。


  1. set/get本来就是为了应对特殊情况而设定的东西,当然要操作别人

    Object.defineProperty(book,"year",{
        value:2014,
        get: function() {
            return this.year + 1;
        },
        set: function(value) {
           this.year = value - 1;
        }
    });

    好了,现在year这个属性又有它自己的值,还有自己的get/set设置器,我们对它进行RHS查找的时候到底应该返回哪个?当然,在语言层面上当然可以设计成直接返回get设置器的返回值,也不和现在的矛盾,但是它既有设置器又有自己的value,这在逻辑上容易被混淆,个人觉得当然还是分开比较好,从这一点上来考虑我觉得这么设计并没有什么不妥。

  2. Lz这种想法大概是源自一种代码上洁癖?我其实也有,你的第二个例子这么使用起来确实怪怪的,对于_year这种内部的变量,假如js有私有变量这种形式的变量的话,我们就能把_year隐藏起来,大概Lz就不会有什么意见了,不知道我有没有猜中?
    我见过的JS代码其实不多,不过需要模拟私有变量的情况,我一般都用闭包的方法:

    var book = new (function(){
        _year = 2014;
        
        Object.defineProperty(this, "year", {
            get: function() {
                return _year;
            },
            set: function(value) {
               _year = value;
            }
        });
    })();

    用这种方法模拟一个类,这个函数形成了个闭包,_year是内部的变量,外部访问不到,这样一来book对象对外就只暴露了year的接口,看起来比刚才那样是不是要好多了?

  3. 如果key超级多,那么需要为每个key额外增加对应的操作器
    这种情况的话,和你有超级多的属性有什么区别吗?那么多属性不一样要挨个赋值……

【热门文章】
【热门文章】