關於__defineGetter__ 和__defineSetter__的說明_應用技巧

源:http://anbutu.javaeye.com/blog/post/194276
關鍵字: JavaScript Mozilla __defineGetter__ __defineSetter__

說明:__defineGetter__ 和__defineSetter__方法只有在Mozilla瀏覽器中有效

 

Getter是一種獲取一個屬性的值的方法,Setter是一種設置一個屬性的值的方法。可以爲任何預定義的核心對象或用戶自定義對象定義getter和setter方法,從而爲現有的對象添加新的屬性。
有兩種方法來定義Getter或Setter方法:
在對象初始化時定義
在對象定義後通過Object的__defineGetter__、__defineSetter__方法來追加定義
在使用對象初始化過程來定義Getter和Setter方法時唯一要做的事情就是在getter方法前面加上“get”,在setter方法前面加上“set”。
還有一點要注意的就是getter方法沒有參數,setter方法必須有一個參數,也就是要設置的屬性的新值。
例如:
[複製此代碼]CODE:
var Obj= {
value:9,
get b() {return this.value;},
set setter(x) {this.value = x;}
}

alert(Obj.value);//輸出值爲9
Obj.value=20;
alert(Obj.value);//輸入值爲20

在對象定義後給對象添加getter或setter方法要通過兩個特殊的方法__defineGetter__和__defineSetter__。這兩個函數要求第一個是getter或setter的名稱,以string給出,第二個參數是作爲getter或setter的函數。
例如我們給Date對象添加一個year屬性:
[複製此代碼]CODE:
Date.prototype.__defineGetter__('currentyear', function() {return this.getFullYear();});
Date.prototype.__defineSetter__('currentyear', function(y) {this.setFullYear(y)});
var now = new Date;
alert(now.currentyear);
now.currentyear= 2006;
alert(now);

至於採用哪種形式主要取決於個人的編程風格,採用第一種形式結構緊湊,更容易理解。但是假如你想在對象定義以後再添加Getter或Setter,或者這個對象的原型不是你寫的或是內置對象,那麼只好採用第二種方式了。

 

在IE和Opera下,DOM對象支持innerText屬性,可以很方便的去除HTML標籤。
但在Firefox不支持該屬性,下面我們來實現FireFox下的innerText屬性。

下面代碼在IE和FireFox中都能運行正常

<html>
<head>
<script type="text/javascript">
if(document.implementation && document.implementation.createDocument)
{

//document.implementation && document.implementation.createDocument是作爲鑑別Mozilla瀏覽器

//HTMLElement換成Element也可以
HTMLElement.prototype.__defineGetter__
(
"innerText",function()
//define a getter method to get the value of innerText,
//so you can read it now!
{
var textRange = this.ownerDocument.createRange();
//Using range to retrieve the content of the object
textRange.selectNodeContents(this);
//only get the content of the object node
return textRange.toString();
// give innerText the value of the node content
}
)
}


function test(){
alert(document.getElementById("test").innerText);
}
window.onload=test;//IE,FF下都能輸出結果
</script>
</head>
<body>
<div id="test">tttttttttttttt</div>
</body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章