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を拡張する方法は(いまのところ)ない。