为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

互换的青春 2018-09-05 09:09:27
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 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

  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额外增加对应的操作器
    这种情况的话,和你有超级多的属性有什么区别吗?那么多属性不一样要挨个赋值……


查看完整回答
反对 回复 2018-10-08
  • 1 回答
  • 0 关注
  • 699 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信