読者です 読者をやめる 読者になる 読者になる

クラスベースとプロトタイプベース

id:shogo4405:20060809:1155103019でJScriptで書いてコンパイルした実行ファイルは外部.jsファイルを読込んだ後にevalが出来るということを思い出して実験的にJSmartyのFileオブジェクトとPluginオブジェクトをJScript.NETに移植しようと試みた。
結果としてはうまく行かなかった。JSmarty.PluginオブジェクトはJSmarty.FileをJSmarty.factoryを利用して継承させているのがそもそもの原因なので別手段が必要なので.NETに書き直すときは設計変更が必要。今回はその際試したクラスベースの記述とプロトタイプベースのコードのエントリー。以下のコードはほぼ等価だと思います。

プロトタイプベース→クラスベースへ

JavaScriptではプロトタイプベース型オブジェクト指向JScript.NETではクラスベースもプロトタイプベース型オブジェクト指向どちらでもかける。下記のプロトタイプベースのコードをクラスベースに訳そうと思うと下記のクラスベースのようなコードになる(Hoge.jsと保存していることとする。)

プロトタイプベースなコード
var Hoge = function(){};
Hoge.prototype = {hoge:function(){return 'hoge';}};
Hoge.Foo = {foo:function(){ return 'foo'; }};
Hoge.Bar = {bar:function(){ return 'bar'; }};
クラスベースなコード
class Hoge
{
    function foo() : String{
        return 'foo';
    }
    static class Foo{
       static function foo() : String{ return 'foo'; }
    }
    static class Bar{
       static function bar() : String{ return 'bar'; }
    }
}

名前空間定義

プロトタイプベース
var Hoge = {};
Hoge.Foo = { foo:function(){return 'foo';} };
Hoge.Bar = { bar:function(){return 'bar';} };
クラスベース(というよりJScript.NET)
package Hoge
{
   class Foo { function foo() : String{ return 'foo'; } }
   class Bar { function bar() : String{ return 'bar'; } }
}

コンパイル

コンパイルはJScriptCompiler(JSC)にパスが通っているいるのならjsc Hoge.jsとするとコンパイルできる。上も下も同様にコンパイルできる。