ECMAScript 5thなオブジェクト生成の話2

昨日書いた new を使わないインスタンス生成は、実際に使ってみると、たかだかオブジェクトの生成ごときで Object.create(Hoge.prototype).init(); とか長いし、init呼ぶの忘れそうだし、init メソッド定義しないといけないし、return this 忘れるとハマるしで糞すぎ。

というわけでFunctionを拡張してオブジェクト生成用のcreateメソッドを作ってみる。

Object.defineProperty(Function.prototype, "create", {
    value: function() {
        var obj = Object.create(this.prototype);
        if (obj.init) {
            // initを持っていれば、イニシャライザとして呼ぶ。
            obj.init.apply(obj, arguments);
        }
        return obj;
    }
});

クラスを定義して…、create()で生成する

// クラス定義
var Multiple = function(){
};
Object.defineProperties(Multiple.prototype,{
    init: { value: function(a, b) { this._a = a; this._b = b; }},
    result: { get: function(){ return this._a * this._b }}
});

// オブジェクト生成
var m = Multiple.create(4,5);
console.log(m.result)                 // 20
console.log(m instanceof Multiple);   // true

これならinit呼びわすれとかも防げるし、変な規約も要らない。しかし何やら本末転倒というか、ますますnewで良いんじゃね?な感じのコードになった気がする…