ダメな例
runstant
superInitでエラーが出ます。('use strict'をなくせば動きます)
改造
tm.createClassをこのように書き換えてください。
tm.createClass = (function(){
var superInit = function () {
this._classTree[this._initCount++]
.prototype
.init
.apply(this, arguments);
};
return function(prop) {
// デフォルト値
prop.init = prop.init || function() {};
prop.superClass = prop.superClass || null;
// クラス作成
var tm_class = function() {
var temp = new tm_class.prototype.creator();
tm_class.prototype.init.apply(temp, arguments);
return temp
};
prop._initCount = 0;
var _classTree = {
0: prop.superClass || Object,
};
for (var i = 0, temp; temp = _classTree[i].prototype.superClass;) {
_classTree[++i] = temp;
}
prop._classTree = _classTree;
// 継承
if (prop.superClass) {
prop.init.owner = tm_class;
tm_class.prototype = Object.create(prop.superClass.prototype);
tm_class.prototype.superInit = superInit;
tm_class.prototype.constructor = tm_class;
}
tm_class.prototype.selfClass = tm_class;
// プロパティを追加
for (var key in prop) {
tm_class.prototype[key] = prop[key];
}
// クリエイタの生成
tm_class.prototype.creator = function() { return this; };
// クリエイタの継承
tm_class.prototype.creator.prototype = tm_class.prototype;
tm_class._class = true;
return tm_class;
};
})();
これでできます。
runstant
注意
検証していませんが、プログラム的に、
tm.defineを使って文字列でsuperClassを指定するときに、superClassがその時点で未定義だと、うまく動きません。