LoginSignup
0
1

More than 5 years have passed since last update.

[tmlib.js] strictモードでクラス作るとエラーになる対策

Last updated at Posted at 2015-07-14

ダメな例

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がその時点で未定義だと、うまく動きません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1