cocos2d-jsではcc.Class.extend()を使ってクラスを継承する。このとき、オーバーライドしたメソッド内からthis._super()
を呼び出すことで、基底クラスのメソッドを呼び出すことができる。
var MySprite = cc.Sprite.extend({
ctor: function () {
this._super();
},
setPosition: function (pos) {
this._super(pos);
}
});
普通に考えれば、ctorから呼んでる_super()
もsetPositionから呼んでいる_super()
も同じもののように見えるのに、実はそれぞれ違うメソッドが呼ばれているのでちょっと不思議だ。
実はextendに秘密があって、これは単に2つのオブジェクトをマージするだけではなく、必要に応じてラッパーメソッドを生成するようになっている。
ラッパーメソッドは、this._super
の内容を差し換えてから、extendに渡されたメソッドを呼び出すようになっている。
CCClass.js
} else if (isFunc && override && hasSuperCall) {
desc.value = (function (name, fn) {
return function () {
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-Class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]);
Object.defineProperty(prototype, name, desc);
} else if (isFunc) {