基底クラスコンストラクタ呼び出しの落とし穴
2005-12-09


基底クラスのコンストラクタを呼び出す話に関連して。「Graviness Blog」と「JavaScriptっぽい。」で示された解決策には少し問題がある。inherit(SubClass, SuperClass) としたとき、SuperClass 内での this の参照先が SubClass のインスタンス (SubClass 内での this) ではなくなってしまうのだ。「Graviness Blog」でのやり方では SubClass.prototype 、「JavaScriptっぽい。」でのやり方では SuperClass.prototype になってしまう。つまり SuperClass 内で this にセットした値は SubClass のインスタンス間で共有されるということだ。

例えば以下のようにすると okaka の名前が変わってしまう。これはちょっとまずいと思う。

// Graviness Blog
function inherit(subClass, superClass) {
  var Temp = new Function();
  Temp.prototype = superClass.prototype;
  subClass.prototype = new Temp;
  subClass.prototype.__super__ = superClass;
  subClass.prototype.constructor = subClass;
}

function Animal(name) {
  this.name = name;
}

function Cat(name, coat) {
  Cat.prototype.__super__(name);
  this.coat = coat;
}

inherit(Cat, Animal);

var okaka = new Cat("Okaka", "calico");
alert(okaka.name); // "Okaka"
var shiro = new Cat("Shiro", "white");
alert(okaka.name); // "Shiro"
// JavaScriptっぽい。
function inherit(subClass, superClass) {
  var Temp = new Function();
  Temp.prototype = superClass.prototype;
  subClass.prototype = new Temp;
  subClass.prototype.constructor = subClass;
  subClass.prototype.superclass = superClass.prototype;
}

function Animal(name) {
  this.name = name;
}

function Cat(name, coat) {
  this.superclass.constructor(name);
  this.coat = coat;
}

inherit(Cat, Animal);

var okaka = new Cat("Okaka", "calico");
alert(okaka.name); // "Okaka"
var shiro = new Cat("Shiro", "white");
alert(okaka.name); // "Shiro"
[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット