Как я могу просто достичь Sencha-Like класса наследования в Backbone? - PullRequest
0 голосов
/ 16 марта 2012

Я запускаю новое приложение Backbone, и мне очень понравилась система наследования классов javascript в Sencha Touch 2.0, в основном я хочу сделать это:

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 Ответ

1 голос
/ 17 марта 2012

Я вижу, к чему вы клоните, но если ваша конечная игра действительно способна вызывать родительский конструктор, я думаю, что несколько сложнее попытаться навязать модель наследования Sencha для Backbone, потому что она настолько проста, легка и в конечном счете у него есть собственная реализация наследования.

Поскольку Backbone extend() существует только в классах Backbone, я думаю , этот - хороший ресурс. Если я не понимаю вас, я думаю, что что-то вроде MyApp.__super__.initialize() в Backbone будет примерно эквивалентно this.callParent() в Sencha Touch.

...