JavaScript之Getters和Setters 平臺(tái)支持等詳細(xì)介紹
更新時(shí)間:2012年12月07日 12:20:58 作者:
現(xiàn)在,JavaScript的Getters和Setters使用非常廣泛,它和每個(gè)JavaScript開發(fā)者的切身利益息息相關(guān),我們先來快速了解什么是Getters和Setters,以及它們?yōu)槭裁春苡杏?然后,我們來看看現(xiàn)在都有哪些平臺(tái)支持Gettets和Setters
來自John Resig早年的文章,大致翻譯了一下,以作備忘。
令人高興的是,我想我終于可以說,“現(xiàn)在,JavaScript的Getters和Setters使用非常廣泛,它和每個(gè)JavaScript開發(fā)者的切身利益息息相關(guān)”。靠,我為了說這句話已經(jīng)等了很久了。
首先,我們先來快速了解什么是Getters和Setters,以及它們?yōu)槭裁春苡杏谩H缓?,我們來看看現(xiàn)在都有哪些平臺(tái)支持Gettets和Setters。
Getters和Setters
Getters和Setters使你可以快速獲取或設(shè)置一個(gè)對象的數(shù)據(jù)。一般來說,一個(gè)對象擁有兩個(gè)方法,分別用于獲取和設(shè)置某個(gè)值,比如:
{
getValue: function(){
return this._value;
},
setValue: function(val){
this._value = val;
}
}
用這種方式寫JavaScript的一個(gè)明顯的好處是:你可以用它來隱藏那些不想讓外界直接訪問的屬性。最終的代碼看起來就像下面這樣(用閉包保存新創(chuàng)建的Filed對象的value):
function Field(val){
var value = val;
this.getValue = function(){
return value;
};
this.setValue = function(val){
value = val;
};
}
于是我們可以這樣使用:
var field = new Field("test");
field.value
// => undefined
field.setValue("test2")
field.getValue()
// => "test2"
我們來模擬上例中的 “隱藏的value屬性”,我們的代碼就像這樣:
function Field(val){
var value = val;
this.__defineGetter__("value", function(){
return value;
});
this.__defineSetter__("value", function(val){
value = val;
});
}
但是呢,你不喜歡這樣寫,而傾向在對象的prototype中定義getters和setters(私有變量寫在哪并不重要),我們可以用另一種語法。
function Field(val){
this.value = val;
}
Field.prototype = {
get value(){
return this._value;
},
set value(val){
this._value = val;
}
};
這種語法看起來很不可思議,但是使用過一段時(shí)間之后,接受它也很容易。
接下來是另一個(gè)例子,它允許外界獲取一個(gè)username數(shù)組,但是卻不能獲取原始的,隱藏的user對象。
function Site(users){
this.__defineGetter__("users", function(){
// JS 1.6 Array map()
return users.map(function(user){
return user.name;
});
};
}
作為福利,我寫了一個(gè)方法,它可以幫你實(shí)現(xiàn)對象的繼承,并且還考慮到了getters和setters
// Helper method for extending one object with another
function extend(a,b) {
for ( var i in b ) {
var g = b.__lookupGetter__(i), s = b.__lookupSetter__(i);
if ( g || s ) {
if ( g )
a.__defineGetter__(i, g);
if ( s )
a.__defineSetter__(i, s);
} else
a[i] = b[i];
}
return a;
}
在我的extend()方法中,你會(huì)發(fā)現(xiàn)兩個(gè)新方法:__lookupGetter__和__lookupSetter__。一旦你真正開始使用getters和setters,這將很有用。
比如,當(dāng)我第一次寫extend()方法時(shí),我遇到了各種errors,我徹底暈了。后來我發(fā)現(xiàn)問題就出在一個(gè)簡單的語句上:a[i] = b[i];
如果對象a存在一個(gè)setter,名字叫做i,對象b存在一個(gè)getter,名字也叫做i,a[i]不是通過別的setter方法賦值的,而是來自b的getter方法。這兩個(gè)__lookup*__方法使你可以獲取原始的函數(shù)。(這段翻得有點(diǎn)晦澀,原文如下)
If a setter existed in object a, named i, and a getter existed in object b, named i, a[i]'s value was being set not to the other setter function, but to the computed value from b's getter function. The two __lookup*__ methods allow you to access the original functions used for the methods (thus allowing you to write an effective extend method, for example).
記住以下幾點(diǎn):
一個(gè)對象內(nèi),每個(gè)變量只能有一個(gè)getter或setter。(因此value可以有一個(gè)getter和一個(gè)setter,但是value絕沒有兩個(gè)getters)
刪除getter或setter的唯一方法是:delete object[name]。delete可以刪除一些常見的屬性,getters和setters。
如果使用__defineGetter__或__defineSetter__,它會(huì)重寫之前定義的相同名稱的getter或setter,甚至是屬性(property)。
平臺(tái)
支持的瀏覽器有:
Firefox
Safari 3+
Opera 9.5
(原文沒寫Chrome,還沒出呢)
我用下面的代碼測試瀏覽器:
javascript:foo={get test(){ return "foo"; }};alert(foo.test);
另外,以下兩種引擎也支持Getters和Setters:
SpiderMonkey
Rhino 1.6R6 (New)
令人高興的是,我想我終于可以說,“現(xiàn)在,JavaScript的Getters和Setters使用非常廣泛,它和每個(gè)JavaScript開發(fā)者的切身利益息息相關(guān)”。靠,我為了說這句話已經(jīng)等了很久了。
首先,我們先來快速了解什么是Getters和Setters,以及它們?yōu)槭裁春苡杏谩H缓?,我們來看看現(xiàn)在都有哪些平臺(tái)支持Gettets和Setters。
Getters和Setters
Getters和Setters使你可以快速獲取或設(shè)置一個(gè)對象的數(shù)據(jù)。一般來說,一個(gè)對象擁有兩個(gè)方法,分別用于獲取和設(shè)置某個(gè)值,比如:
復(fù)制代碼 代碼如下:
{
getValue: function(){
return this._value;
},
setValue: function(val){
this._value = val;
}
}
用這種方式寫JavaScript的一個(gè)明顯的好處是:你可以用它來隱藏那些不想讓外界直接訪問的屬性。最終的代碼看起來就像下面這樣(用閉包保存新創(chuàng)建的Filed對象的value):
復(fù)制代碼 代碼如下:
function Field(val){
var value = val;
this.getValue = function(){
return value;
};
this.setValue = function(val){
value = val;
};
}
于是我們可以這樣使用:
復(fù)制代碼 代碼如下:
var field = new Field("test");
field.value
// => undefined
field.setValue("test2")
field.getValue()
// => "test2"
我們來模擬上例中的 “隱藏的value屬性”,我們的代碼就像這樣:
復(fù)制代碼 代碼如下:
function Field(val){
var value = val;
this.__defineGetter__("value", function(){
return value;
});
this.__defineSetter__("value", function(val){
value = val;
});
}
但是呢,你不喜歡這樣寫,而傾向在對象的prototype中定義getters和setters(私有變量寫在哪并不重要),我們可以用另一種語法。
復(fù)制代碼 代碼如下:
function Field(val){
this.value = val;
}
Field.prototype = {
get value(){
return this._value;
},
set value(val){
this._value = val;
}
};
這種語法看起來很不可思議,但是使用過一段時(shí)間之后,接受它也很容易。
接下來是另一個(gè)例子,它允許外界獲取一個(gè)username數(shù)組,但是卻不能獲取原始的,隱藏的user對象。
復(fù)制代碼 代碼如下:
function Site(users){
this.__defineGetter__("users", function(){
// JS 1.6 Array map()
return users.map(function(user){
return user.name;
});
};
}
作為福利,我寫了一個(gè)方法,它可以幫你實(shí)現(xiàn)對象的繼承,并且還考慮到了getters和setters
復(fù)制代碼 代碼如下:
// Helper method for extending one object with another
function extend(a,b) {
for ( var i in b ) {
var g = b.__lookupGetter__(i), s = b.__lookupSetter__(i);
if ( g || s ) {
if ( g )
a.__defineGetter__(i, g);
if ( s )
a.__defineSetter__(i, s);
} else
a[i] = b[i];
}
return a;
}
在我的extend()方法中,你會(huì)發(fā)現(xiàn)兩個(gè)新方法:__lookupGetter__和__lookupSetter__。一旦你真正開始使用getters和setters,這將很有用。
比如,當(dāng)我第一次寫extend()方法時(shí),我遇到了各種errors,我徹底暈了。后來我發(fā)現(xiàn)問題就出在一個(gè)簡單的語句上:a[i] = b[i];
如果對象a存在一個(gè)setter,名字叫做i,對象b存在一個(gè)getter,名字也叫做i,a[i]不是通過別的setter方法賦值的,而是來自b的getter方法。這兩個(gè)__lookup*__方法使你可以獲取原始的函數(shù)。(這段翻得有點(diǎn)晦澀,原文如下)
If a setter existed in object a, named i, and a getter existed in object b, named i, a[i]'s value was being set not to the other setter function, but to the computed value from b's getter function. The two __lookup*__ methods allow you to access the original functions used for the methods (thus allowing you to write an effective extend method, for example).
記住以下幾點(diǎn):
一個(gè)對象內(nèi),每個(gè)變量只能有一個(gè)getter或setter。(因此value可以有一個(gè)getter和一個(gè)setter,但是value絕沒有兩個(gè)getters)
刪除getter或setter的唯一方法是:delete object[name]。delete可以刪除一些常見的屬性,getters和setters。
如果使用__defineGetter__或__defineSetter__,它會(huì)重寫之前定義的相同名稱的getter或setter,甚至是屬性(property)。
平臺(tái)
支持的瀏覽器有:
Firefox
Safari 3+
Opera 9.5
(原文沒寫Chrome,還沒出呢)
我用下面的代碼測試瀏覽器:
復(fù)制代碼 代碼如下:
javascript:foo={get test(){ return "foo"; }};alert(foo.test);
另外,以下兩種引擎也支持Getters和Setters:
SpiderMonkey
Rhino 1.6R6 (New)
相關(guān)文章
JS實(shí)現(xiàn)隨頁面滾動(dòng)顯示/隱藏窗口固定位置元素
窗口固定位置顯示元素,當(dāng)頁面高度大于某高度,并且頁面向下滾動(dòng)時(shí),顯示該元素;當(dāng)頁面位置小于某高度,或者頁面向上滾動(dòng)時(shí),隱藏該元素,下面通過本文給大家介紹JS實(shí)現(xiàn)隨頁面滾動(dòng)顯示/隱藏窗口固定位置元素,需要的朋友參考下吧2016-02-02
兩個(gè)JavaScript jsFiddle JSBin在線調(diào)試器
這兩個(gè)工具都是剛誕生不久,都還在不斷完善中,雖然目前jsFiddle要優(yōu)于JS Bin,但是我還是更看好后者2010-03-03
詳細(xì)聊聊TypeScript中unknown與any的區(qū)別
unknown類型比較謙虛,就和他本身的意思一樣,他從不禍害到其他的變量,但是any類型就是那種惡霸,屬于什么都不管,誰也不敢管的類型,這篇文章主要給大家介紹了關(guān)于TypeScript中unknown與any區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-10-10
ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法
這篇文章主要介紹了ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法,分析了重載的原理及使用Proxy和Reflect來實(shí)現(xiàn)重載的操作步驟與相關(guān)技巧,需要的朋友可以參考下2017-03-03
javascript同步服務(wù)器時(shí)間和同步倒計(jì)時(shí)小技巧
本文給出如何在頁面上同步顯示服務(wù)器時(shí)間的解決方案,能夠?qū)崿F(xiàn)同步服務(wù)器時(shí)間、同步倒計(jì)時(shí),卻不占用服務(wù)器太多資源,下面我給寫出實(shí)現(xiàn)的思路2015-09-09
javascript事件的綁定基礎(chǔ)實(shí)例講解(34)
這篇文章主要為大家詳細(xì)介紹了javascript事件的綁定基礎(chǔ)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

