1 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
set/get本來就是為了應(yīng)對(duì)特殊情況而設(shè)定的東西,當(dāng)然要操作別人
Object.defineProperty(book,"year",{ value:2014, get: function() { return this.year + 1; }, set: function(value) { this.year = value - 1; } });
好了,現(xiàn)在
year
這個(gè)屬性又有它自己的值,還有自己的get/set
設(shè)置器,我們對(duì)它進(jìn)行RHS查找的時(shí)候到底應(yīng)該返回哪個(gè)?當(dāng)然,在語言層面上當(dāng)然可以設(shè)計(jì)成直接返回get
設(shè)置器的返回值,也不和現(xiàn)在的矛盾,但是它既有設(shè)置器又有自己的value
,這在邏輯上容易被混淆,個(gè)人覺得當(dāng)然還是分開比較好,從這一點(diǎn)上來考慮我覺得這么設(shè)計(jì)并沒有什么不妥。Lz這種想法大概是源自一種代碼上潔癖?我其實(shí)也有,你的第二個(gè)例子這么使用起來確實(shí)怪怪的,對(duì)于
_year
這種內(nèi)部的變量,假如js有私有變量
這種形式的變量的話,我們就能把_year
隱藏起來,大概Lz就不會(huì)有什么意見了,不知道我有沒有猜中?
我見過的JS代碼其實(shí)不多,不過需要模擬私有變量的情況,我一般都用閉包的方法:var book = new (function(){ _year = 2014; Object.defineProperty(this, "year", { get: function() { return _year; }, set: function(value) { _year = value; } }); })();
用這種方法模擬一個(gè)類,這個(gè)函數(shù)形成了個(gè)閉包,
_year
是內(nèi)部的變量,外部訪問不到,這樣一來book
對(duì)象對(duì)外就只暴露了year
的接口,看起來比剛才那樣是不是要好多了?如果key超級(jí)多,那么需要為每個(gè)key額外增加對(duì)應(yīng)的操作器
這種情況的話,和你有超級(jí)多的屬性有什么區(qū)別嗎?那么多屬性不一樣要挨個(gè)賦值……
添加回答
舉報(bào)