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,
... ....
};
是不是不太合理。。? 能写个函数统一处理吧?能的话 也是多个函数啊。
-
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
,这在逻辑上容易被混淆,个人觉得当然还是分开比较好,从这一点上来考虑我觉得这么设计并没有什么不妥。 -
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
的接口,看起来比刚才那样是不是要好多了? 如果key超级多,那么需要为每个key额外增加对应的操作器
这种情况的话,和你有超级多的属性有什么区别吗?那么多属性不一样要挨个赋值……