昨日書いた 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で良いんじゃね?な感じのコードになった気がする…