C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/11/14 00:11
JavaScriptはオブジェクト指向言語である。
ただし、”クラスベース”のオブジェクト指向言語 ( C#やJavaなど ) ではなく、”プロトタイプベース”のオブジェクト指向言語である。

以下、JavaScriptでのOOPについての簡単な解説。


【 コンストラクタ 】
オブジェクトの雛形は " コンストラクタ " と呼ばれる関数として定義する。これは、クラスベース オブジェクト指向言語の " クラス " に相当する。コンストラクタは関数なので、普通の関数と同じように呼び出すこともできる。 ( 普通、そんな使い方はしないけど。 )
コンストラクタからオブジェクトを生成するには、new 演算子を用いる。
// Hogeコンストラクタ
function Hoge()
{
}

// Hogeオブジェクト生成
var hogeObj = new Hoge();


[ thisキーワード ]
コンストラクタ内 ( と、後述するインスタンスメソッド内 ) では、thisキーワードによって、コンストラクタのインスタンスを参照することができる。
ただし、プライベートメソッド内では、通常は、コンストラクタのインスタンスではなくwindowオブジェクトを参照してしまうので注意。( 詳細はこちらの記事


【 インスタンスフィールド 】
インスタンスフィールドは2種類に大別できる。

[ パブリックフィールド ]
パブリックフィールドには、インスタンスの外部からアクセスすることができる。
定義するには、コンストラクタ内で、そのコンストラクタのインスタンスに対して動的にフィールドを追加する。
function Hoge()
{
    this.publicField1 = 0;
}


[ プライベートフィールド ]
プライベートフィールドには、インスタンスの外部からアクセスすることができない。また、パブリックメソッド ( 後述 ) からもアクセスすることができない。
定義するには、コンストラクタ内で、varキーワードによる変数宣言を行う。また、コンストラクタの引数リストも、プライベートフィールドとなる。
function Hoge(arg1, arg2)    // arg1とarg2もプライベートフィールド
{
    var privateField1 = 0;
}

なお、プライベートフィールドは、 this.[ プライベートフィールド名 ] といった参照の仕方ができないので注意。参照するには直接プライベートフィールド名を記述する。


【 インスタンスメソッド 】
インスタンスメソッドは3種類に大別できる。

[ パブリックメソッド ]
パブリックメソッドには、インスタンスの外部からアクセスすることができる。また、パブリックメソッド内から、プライベートなメンバにアクセスすることはできない。
定義するには、コンストラクタのprototypeプロパティ ( 詳細はそのうち... ) に格納されているオブジェクトに、メソッドを追加する。
function Hoge()
{
}

Hoge.prototype.publicMethod1 =
    function()
    {
    };

prototypeプロパティに格納されているオブジェクトに対してメソッドを追加するため、パブリックメソッドとなる関数オブジェクトは、ソースコードのロード時に一度だけ生成される。


[ プレビレッジドメソッド ]
プレビレッジドメソッドには、インスタンスの外部からアクセスすることができる。また、プレビレッジドメソッド内から、プライベートなメンバにアクセスすることができる。
定義するには、コンストラクタ内でインスタンスフィールドに関数オブジェクトを設定する。
function Hoge()
{
    this.privilegedMethod1 =
        function()
        {
        };
}

コンストラクタ内で自分自身のパブリックフィールドにメソッドを追加するので、プレビレッジドメソッドとなる関数オブジェクトは、コンストラクタ実行 ( インスタンス化 ) のたびに生成される。


[ プライベートメソッド ]
プライベートメソッドには、インスタンスの外部からアクセスすることはできない。また、プライベートメソッド内から、プライベートなメンバにアクセスすることができる。
定義するには、コンストラクタ内でプライベートフィールドに関数オブジェクトを設定する。
function Hoge()
{
    var privateMethod1 =
        function()
        {
        };
}

コンストラクタ内で自分自身のプライベートフィールドにメソッドを追加するので、プライベートメソッドとなる関数オブジェクトは、コンストラクタ実行 ( インスタンス化 ) のたびに生成される。


【 静的メソッド 】
静的メソッドは必ずパブリックになる。インスタンスフィールドやインスタンスメソッドにはアクセスすることができない。
定義するには、コンストラクタ関数自体のインスタンスフィールドに関数オブジェクトを設定する。前述したように、コンストラクタは、それ自体が ( 関数 ) オブジェクトである。
function Hoge()
{
}

Hoge.staticMethod1 =
    function()
    {
    };


【 オブジェクトを直接表記 】
以前書いた記事を参照


【 参考 】
Collection & Copy - JavaScriptにおけるプライベートメンバ
タグ: JavaScript











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/41-faf87a19