Javascriptでいい感じにプロトタイプを継承する
Javascriptでプロトタイプを継承するには
function newClass(){ superClass.apply(this, arguments); } newClass.prototype = new superClass(); // superClassを継承 var newObject = new newClass(); console.log(newObject instanceof superClass); // true
こんなコードを書けばいいわけだけど、
これだとsuperClassオブジェクトを作っているところがスマートじゃない。
newClass.prototype = superClass.prototype; // superClassを継承
これだと余計なオブジェクトはつくらないけど、
newClassのprototypeを拡張するとsuperClassのprototypeも拡張されてしまう。
というわけで
newClass.prototype = (function(C){ C.prototype = superClass.prototype; // superClassを継承 return new C(); })(function(){});
こんな書き方をする必要がある。
さらに今はやり(?)のObject.definePropertiesを使って
newClass.prototype = Object.defineProperties((function(C){ C.prototype = superClass.prototype; // superClassを継承 return new C(); })(function(){}), { methodA: { value: function(){ // methodA } } });
とするとfor(〜 in 〜)したときに余計なプロパティを列挙しなくなる。
Chromeで、すでに使用可能。
拡張を作るときに活用できる。
ただしArrayの拡張はこれでもうまくいかない。
myArray = new MyArray(); myArray[100] = 100;
と、代入したときにlengthが101にならない等の問題がある。
たぶん完全にArrayを拡張する方法は(いまのところ)ない。