我怎样才能简单地在Backbone中实现Sencha-Like类继承?

时间:2012-03-16 17:57:37

标签: javascript backbone.js sencha-touch extjs underscore.js

我正在开始一个新的Backbone应用程序,我一直非常喜欢Sencha Touch 2.0的javascript类继承系统,基本上我希望能够做到这一点:

Helium.define('Application', {
    namespace: 'Helium',
    constructor: function() {
        console.warn('Helium');
    }
});

Helium.define('Application', {
    namespace: 'MyApp',
    extend: 'Backbone.Events',
    routers: ['Cards'],
    constructor: function() {
        console.warn(this);
        this.callParent();
        console.warn('MyApp');
        //console.warn(Helium.getDisplayName(arguments.callee));
    }
});

我坚持原型链定义(使this.callParent()工作):

        var p = Object.create(extend);
        var o = _.extend(p, data);
        /*function() {
            var _o = _.extend(p, data);
            _o.constructor.apply(o, arguments);
            return _o;
        };*/
        o.prototype.superclass = p;
        o.prototype.callParent = function() {
            console.warn(p);
        };

到目前为止,这是完整的微观实施:

到目前为止,我已经这样做了:

_.mixin({
    resolve : function(path, base, separator) {
        var parts = path.split('.' || separator),
            key = parts.pop();
            base = base || window;

        while (parts.length) {
            part = parts.shift();
            base = base[part] = base[part] || {};
        }
        base[key] = base[key] || {};

        return base[key];
}});

Helium = {

    define: function(className, data) {

        var base = window,
            extend = data.extend || {constructor : function() {}},
            namespace = data.namespace || null;

        if(namespace) {
            window[namespace] = window[namespace] || {};
            base = window[namespace];
        }

        if(_.isString(extend)) extend = _.resolve(extend);
        if(!extend) throw 'Extend error';

        var parts = className.split('.'),
            key = parts.pop();
        while (parts.length) {
            part = parts.shift();
            base = base[part] = base[part] || {};
        }

        delete data.extend;
        //delete data.namespace;
        data.$name = key;
        data.$className = className;

        var p = Object.create(extend);
        var o = _.extend(p, data);
        /*function() {
            var _o = _.extend(p, data);
            _o.constructor.apply(o, arguments);
            return _o;
        };*/
        o.prototype.superclass = p;
        o.prototype.callParent = function() {
            console.warn(p);
        };

    },

    getDisplayName: function(callee) {
        console.warn('getDisplayName', [this, arguments]);
        console.warn(callee.toString());

    }

};

1 个答案:

答案 0 :(得分:1)

我看到你在这里会发生什么,但如果你的最终游戏真的能够调用父构造函数,我认为尝试在Backbone上强加Sencha的继承模型有点令人费解,因为它非常简单和轻量级,最终它有自己的继承实现。

由于Backbone的extend()仅存在于Backbone类中,我认为this是一个很好的资源。除非我误解你,否则我认为Backbone中MyApp.__super__.initialize()的某些内容大致相当于Sencha Touch中的this.callParent()

相关问题