2009年2月2日

set, get

用物件寫程式 | 取用成員 | 繼承 | set, get
get | set | __defineGetter__() | __defineSetter__() | __lookupGetter__() | __lookupSetter__()

此段講的設值器(setter)與取值器(getter),IE 沒有支援;Firefox, Safari, Chrome 可以正確執行。IE8 開始有支援 __defineGetter__(), __defineSetter__(), __lookupGetter__, __lookupSetter__。IE8 未測試,下次補測。

get

在物件中,宣告一個特徵與函式的連結,讀取此特徵時,會呼用該函式。其語法是:

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

在物件中,宣告一個特徵與函式的連結,設定此特徵時,會呼用該函式。其語法是:

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__()

宣告取值器。其語法是:

物件.__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元

__defineSetter__()

宣告設值器。其語法是:

物件.__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__()

傳回取值器的函式。其語法是:

物件實體.__lookupGetter__( 取值器字串 )

請勿將設值器用在此。

  • 程式用法:

    <script type='text/javascript'>
    document.write( Jolin.__lookupGetter__('info') );
    </script>

  • 執行結果:

    get info () { return this.name +' / '+ this.age }

__lookupSetter__()

傳回設值器的函式。其語法是:

物件實體.__lookupSetter__( 設值器字串 )

請勿將取值器用在此。

  • 程式用法:

    <script type='text/javascript'>
    document.write( Temperature.__lookupSetter__('F') );
    </script>

  • 執行結果:

    set F ( deg ) { this.Celsius=(deg-32)*5/9; this.Fahrenheit=deg; }

delete

可以用 delete 刪除設值器與取值器。

  • 程式用法:

    <script type='text/javascript'>
    delete Temperature.info;
    document.write( Temperature.info );
    </script>

  • 執行結果:

    undefined


©2008-2009 by ant2legs, All Rights Reserved. ant2legs 擁有其製作的文章,圖片與程式的著作權,所有權利保留。