此段講的設值器(setter)與取值器(getter),IE 沒有支援;Firefox, Safari, Chrome 可以正確執行。IE8 開始有支援 __defineGetter__(), __defineSetter__(), __lookupGetter__, __lookupSetter__。IE8 未測試,下次補測。
在物件中,宣告一個特徵與函式的連結,讀取此特徵時,會呼用該函式。其語法是:
get 特徵名 [函式名] () { 指令集 }
函式沒有參數。可選擇性的設函式名。在 Firefox 可以設函式名,但是 Safari, Chrome 會導致失敗,所以不能設函式名。建議不設。
- 程式用法:
<script type='text/javascript'>
var Jolin = {
name:'蔡依林',
age:27,
get info () { return this.name +' / '+ this.age }
}
document.write( Jolin.info );
</script> - 執行結果:
蔡依林 / 27
- 請注意:使用時,不要加函式的括號,例如 Jolin.info(),會導致錯誤。
- 筆者曾嘗試將 get 用在 物件製造器,但沒有成功。
在物件中,宣告一個特徵與函式的連結,設定此特徵時,會呼用該函式。其語法是:
set 特徵名 [函式名] ( 值 ) { 指令集 }
可選擇性的設函式名。在 Firefox 可以設函式名,但是 Safari, Chrome 會導致失敗,所以不能設函式名。建議不設。
函式只能有一個參數。在設定特徵時,等號右邊的值會傳給參數。
下例是華氏與攝氏溫度的轉換。
- 程式用法:
<script type='text/javascript'>
var Temperature = {
Celsius:0,
Fahrenheit:32,
set F ( deg )
{
this.Celsius=(deg-32)*5/9;
this.Fahrenheit=deg;
},
get info () {return this.Fahrenheit +' F = '+ this.Celsius +' C';}
}
Temperature.F=41;
document.write( Temperature.info );
</script> - 執行結果:
41 F = 5 C
宣告取值器。其語法是:
物件.__defineGetter__( 特徵名字串, 函式 )
- 程式用法:
<script type='text/javascript'>
function Game(name, price)
{
this.name=name;
this.price=price;
this.__defineGetter__('info',
function () { return this.name +' / '+ this.price +'元' } );
//get info () { return this.name +' / '+ this.price +'元' } ;
}
var gun=new Game('槍戰遊戲', 100);
document.write( gun.info );
</script> - 執行結果:
槍戰遊戲 / 100元
- 筆者嘗試將 get 用在 物件製造器,但沒有成功。
宣告設值器。其語法是:
物件.__defineSetter__( 特徵名字串, 函式 )
下面的範例,動態的增加已存在的物件實體之設值器。
- 程式用法:
<script type='text/javascript'>
function ces( deg )
{
this.Celsius=deg;
this.Fahrenheit=deg*9/5+32;
}
Temperature.__defineSetter__('C', ces );
Temperature.C=10;
document.write( Temperature.info );
</script> - 執行結果:
50 F = 10 C
也可以接在 prototype 後使用。如此可以增加物件型態及所有物件實體的取值器與設值器。
- 程式用法:
<script type='text/javascript'>
Game.prototype.__defineGetter__('USD', function ( ) { return this.price/32;} );
var bike=new Game('賽車遊戲', 128);
document.write( gun.USD
+'<br />'+ bike.USD );
</script> - 執行結果:
3.125
4
傳回取值器的函式。其語法是:
物件實體.__lookupGetter__( 取值器字串 )
請勿將設值器用在此。
- 程式用法:
<script type='text/javascript'>
document.write( Jolin.__lookupGetter__('info') );
</script> - 執行結果:
get info () { return this.name +' / '+ this.age }
傳回設值器的函式。其語法是:
物件實體.__lookupSetter__( 設值器字串 )
請勿將取值器用在此。
- 程式用法:
<script type='text/javascript'>
document.write( Temperature.__lookupSetter__('F') );
</script> - 執行結果:
set F ( deg ) { this.Celsius=(deg-32)*5/9; this.Fahrenheit=deg; }
可以用 delete 刪除設值器與取值器。
- 程式用法:
<script type='text/javascript'>
delete Temperature.info;
document.write( Temperature.info );
</script> - 執行結果:
undefined