Site on Magic

Photography and Designing : Since 1996

いつのまにか 13 周年。

April 2008 , monthly archive

spacer

プライベートインスタンス変数または関数への参照

Posted at 2008.4.1

プライベートインスタンス変数あるいは、プライベートインスタンス関数(プライベートインスタンスメソッド)は、原則としてクラス変数やクラス関数、インスタンスからも参照することはできません。 たとえば、コンストラクタ内で定義されたローカル変数(プライベートインスタンス変数)が該当します。

 

var classCounter = function(param)

{

    // Instance-Variable

    this.param = param;

    this.number = 0;

 

    // Private-Instance-Variable (Local Variable)

    var version = '1.0';

}

classCounter.prototype.counter()

{

    this.number++; return this.number;

}

上のコードの場合、インスタンス変数 param, number はインスタンスから参照可能ですが、変数 version は classCounter() 関数のローカル変数なので、クラスやインスタンス、あるいはインスタンス関数 counter() からも参照することはできません。 Javascript にはクロージャの概念があります。クロージャは、エンクロージャの持つローカル変数(レキシカル変数)に参照できる特徴があるので、この方法を使います。

 

var classCounter = function(param)

{

    this.self = this;

    this.param = param;

    var version = '1.0';

 

    // Private-Instance-Method

    var getVersion = function()

    {

        return version;

    }

    // Instance-Method

    this.getVersion = getVersion;

}

classCounter.prototype.counter()

{

    this.number++; return this.number;

}

エンクロージャ classCounter() 関数に、変数 version を返すためのインスタンス関数 getVersion() 関数を追加し、それをクロージャとします。いわば、ローカル変数との橋渡しをするバイパス関数となります。

spacer
spacer

Javascript クラスの定義とスコープ

Posted at 2008.4.1
Javascript のクラス定義は簡単ですが中途半端な言語仕様なので小技があったりと定義自体もさまざま。ここでは一般的なクラス定義をまじえて挙動を解説しました。
クラス classCounter は、コンストラクタで渡された引数 begin の値を保持し、count() メソッドで begin をインクリメントします。getNumber() メソッドで現在の begin の値を返し、getCreateDate() メソッドでカウントを開始した日時を返します。 さらに、version パラメータでクラスのプログラムバージョンを返します。
var classCounter = function(begin)
{
    this.beginDate = new Date();
    var num = begin;
    this.count = function()
    {
        num++;
    }
    this.getNumber = function(){
        return num;
    }
}
classCounter.version = '1.0';
classCounter.prototype.getCreateDate = function()
{
    return this.beginDate;
}
まず、変数や関数(メソッド)には、クラス自体が持っていてインスタンス化されていない状態でもパブリックに参照可能な「クラス変数/関数」と、インスタンス化されてはじめてパブリックに参照可能な「インスタンス変数/関数」があります。
「インスタンス変数/関数」は、コンストラクタによってカプセル化されていますが、インスタンスの保持する変数であり関数なので、当然クラス関数からは参照はできません。一方、「クラス変数/関数」はインスタンスの保持するものではないのでクラスの状態で参照でき、インスタンスからは参照することができません。
上のコードでは、classCounter() コンストラクタの this.beginDate がインスタンス変数の定義、classCounter.version がクラス変数の定義です。また、classCounter() コンストラクタの "var num" で定義されている num 変数はレキシカル変数(コンストラクタのローカル変数)であるため、エンクロージャであるコンストラクタのクロージャ (this.count および this.getNumber) 以外からは参照できません。 this.count() 関数および this.getNumber() 関数はインスタンス関数です。さらに、classCounter.prototype.getCreateDate() 関数も同様のインスタンス関数です。インスタンス関数の定義は、prototype で定義することも、コンストラクタで this 参照して定義することもできるわけです。 注意点として、this.beginDate 変数はインスタンス変数なので、getCreateDate() 関数をクラス関数として(classCounter.getCreateDate のように)定義してしまったら、内部でインスタンス変数 this.beginDate を参照する部分でエラーになります。
このように、クラスの持つプロパティ(変数や関数)のスコープ、インスタンスの持つプロパティのスコープに注意しなければいけません。カプセル化しても、クラスの持つ変数がそのクラスのすべてから参照可能ではないからです。基本的にはクラスプロパティはクラスそのものを扱うものとし、インスタンスプロパティはインスタンスそのものを扱うものとするべきです。 利便性から必要な場合は、インスタンス(this)を引数としてスコープを明示的に指示させるようにします。
classCounter.prototype.beginDate = null;
classCounter.getCreateDate = function(scope)
{
    return scope.beginDate();
}
上のコードでは、getCreateDate() 関数は classCounter クラスのクラスメソッドですが、scope 引数によって明示的にスコープを渡すことでクラス変数 beginDate への参照を可能にしています。
spacer
spacer

島根山中でジェット機発見

Posted at 2008.4.13
photo
Flickr Honda Fit with Jet plane, originally uploaded by Giyu (Velvia).

ぶらり島根ドライブで怪しい道などを探索してると、深い山中のほとんど人や車が入ってないところを抜けたところで、あろうことかジェット機を発見。
記念に今回ドライブに使った新型Fitと記念撮影!!

spacer
spacer

baby selloum

Posted at 2008.4.22
photo
Flickr baby selloum, originally uploaded by Giyu (Velvia).

とらちょのママン、かなちょからセロームとかいう観葉植物もらいました。


コンピュータばかりの所に植物あるとなんかイイね(′ω`)

虫とか来ないよね・・・

spacer
Search Entries
Calender
<  2008. 4  >
sunmontuewedthufrisat
3031 1 2345
6789101112
13 141516171819
2021 22 23242526
27282930123
Current Month Entries
Profile & Equipments
me name : Giyu

loc: Hiroshima, Japan.
Job : Graphics, Contents, Photographic, web Designer.
equipment photo (Apr 2007) : Nikon DSLR, F5 SLR, Nikkor Lens, Manfrotto tripod, Velbon trioid, DOMKE F-2 BN, F-3x, Lowepro and more...
Licence
creative commons
このブログは、クリエイティブ・コモンズ・ライセンスで保護されています。
このサイトに含まれる写真には一部プロパティ/モデルリリースをクリアしてないものも含まれています。基本的に個々のクリエイティブコモンズ・ライセンスに準拠していますが、複製・引用・転載は注意してください。
©1996-2009 Giyu (Velvia), Site on Magic., All rights reserved.

ATOM feed