イナヅマTVログ

HaxeとTypeScriptでJavaScript。デフォルト引数と継承とpublic, privateを比べてみた

| 0件のコメント

AltJSの二大巨頭HaxeとTypeScriptさん達がJavaScriptをどういう風に書き出すか試してみました。
Haxe
TypeScript

今までコツコツと書きためてきたオレオレJavaScriptライブラリ。
いつかちゃんと整理したいと思ってた。
整理ついでに生JavaScriptだしHaxeかTypeScriptで書き直したいなっと考えた。

Haxe

// Class Vow
package ;
import String;
class Vow {
    private var _vow:String;
    private var _age:Int;
 
    public function new( vow: String = "WowWow", age: Int = 16 ) {
        _vow = vow;
        _age = age;
    }
 
    public function say ():String {
        return _vow;
    }
 
    private function _getAge ():Int {
        return _age;
    }
}
 
// Child Class Dog
package ;
class Dog extends Vow {
    public function new() {
        super( "Uuuuuuu" );
    }
}

コンパイル後

(function () { "use strict";
function $extend(from, fields) {
	function inherit() {}; inherit.prototype = from; var proto = new inherit();
	for (var name in fields) proto[name] = fields[name];
	if( fields.toString !== Object.prototype.toString ) proto.toString = fields.toString;
	return proto;
}
var Vow = function(vow,age) {
	if(age == null) age = 16;
	if(vow == null) vow = "WowWow";
	this._vow = vow;
	this._age = age;
};
Vow.prototype = {
	_getAge: function() {
		return this._age;
	}
	,say: function() {
		return this._vow;
	}
}
var Dog = function() {
	Vow.call(this,"Uuuuuuu");
};
Dog.__super__ = Vow;
Dog.prototype = $extend(Vow.prototype,{
});
var Main = function() {
};
Main.main = function() {
	var _dog = new Dog();
	var voice = _dog.say();
}
Main.main();
})();

TypeScript

class Vow {
    private _vow: string;
    private _age: number;
    constructor ( vow: string="won won", age: number = 16 ) {
        this._vow = vow;
        this._age = age;
    }
 
    say() {
        return this._vow;
    }
 
    private _getAge ():number {
        return this._age;
    }
}
 
class Dog extends Vow {
    constructor () {
        super( "Uuuuuuuu" );
    }
}

コンパイル後

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
 
var Vow = (function () {
    function Vow(vow, age) {
        if (typeof vow === "undefined") { vow = "won won"; }
        if (typeof age === "undefined") { age = 16; }
        this._vow = vow;
        this._age = age;
    }
    Vow.prototype.say = function () {
        return this._vow;
    };
 
    Vow.prototype._getAge = function () {
        return this._age;
    };
    return Vow;
})();
 
var Dog = (function (_super) {
    __extends(Dog, _super);
    function Dog() {
        _super.call(this, "Uuuuuuuu");
    }
    return Dog;
})(Vow);

publicとprivate

Haxe、TypeScriptどちらも書き出されたJavaScriptにprivateな細工はありませんでした。
public扱いにしかならない。
う〜〜ん、これはしょうが無いかぁ。

デフォルト引数

数値チェックは無かった。
残念!

Haxe
判定は hoge == null なので引数無しでも判定可能ってことかな。
こんな感じで使えるはず。

var dog = new Dog();
console.log( dog.say(), dog._getAge() );// Uuuuuuuu, 18

TypeScript
判定は typeof hoge === “undefined” なので使い方によってはまずいことなりそう。

var vow = new Vow( null, null );
console.log( vow.say(), vow._getAge() );// null, null

継承

コードは若干違うけど、どちらも親クラスの property を列挙して子クラスへコピーしてます。
子クラス.prototype = Object.create( 親クラス.prototype );
な感じをpolyfillを考慮して行ってるのでしょうか。

書き出されたJavaScriptのためのものじゃ無い

当たり前のことだったんだけど、
Haxe, TypeScript どちらも開発時のコード品質を保つために使用するもので書き出されたJavaScriptの品質のためで無いみたい。

そんな気がしてたけど期待してただけにちょっとがっかり。

書き出されたJavaScriptをライブラリとして生JavaScriptプロジェクトで使うのはちょいと無理がありそう。
プロジェクトメンバ全員がHaxe, TypeScriptを使用して価値が出るものなのですね。

オレオレ一人プロジェクトだとありかも。

オレオレ生JavaScriptライブラリはしばらく生のまま熟成させていこうかな。
簡単に腐りそうだけど。

Haxeかなぁ

ちょっとしか試してないけど Haxe が良さそうに見えました。
ActionScriptっぽいシンタックスとか馴染みやすそうです。

TypeScriptはmicrosoftが後ろについてる安心感(継続する)がありますけど。
microsoftだし。
とも思ってしまいます。

Haxeの歴史の長さに安定感がありそうです。
Documentも充実してるし。

かなり前に試してみようとして挫折したけど今ならどうにかなるかな。

Haxe Documentを超斜め読みしてみた。
Enumが重要らしい。
勉強することばっかり…

おすすめサイトとか教えてくださいな。

【おまけ】
コードはIntelliJ IDEA 12 で書きました。
無料のエディタもある中で高めな価格ですけど中々いいやつです。

コメントを残す

必須欄は * がついています