Доступ к родительскому классу в Backbone - PullRequest
67 голосов
/ 23 января 2012

Мне нужно вызвать метод initialize родительского класса из унаследованного MyModel -класса, вместо того, чтобы полностью перезаписать его, как я делаю сегодня.

Как я мог это сделать?

Вот как выглядит мой код прямо сейчас:

BaseModel = Backbone.Model.extend({
    initialize: function(attributes, options) {
        // Do parent stuff stuff
    }
});

MyModel = BaseModel.extend({
    initialize: function() {
        // Invoke BaseModel.initialize();
        // Continue doing specific stuff for this child-class.
    },
});

Ответы [ 8 ]

128 голосов
/ 23 января 2012

Попробуйте

MyModel = BaseModel.extend({
    initialize: function() {
        BaseModel.prototype.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
50 голосов
/ 23 января 2012
MyModel = BaseModel.extend({
    initialize: function() {
        MyModel.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
11 голосов
/ 07 декабря 2012

Это сработало для меня, когда я пытался наследовать среди своих моделей:

MyModel.prototype.initialize.call(this, options);

Ссылка от http://documentcloud.github.com/backbone/#Model-extend

Спасибо.

5 голосов
/ 23 января 2012

Я думаю, это будет

MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.call(this);
        // Continue doing specific stuff for this child-class.
    },
});
4 голосов
/ 14 февраля 2013

это, кажется, почти дубликат Super в Backbone , поэтому вы хотите что-то вроде этого:

Backbone.Model.prototype.initialize.call(this);
2 голосов
/ 21 февраля 2013

Похоже на @whererhys, но я бы использовал apply вместо call, если BaseModel.initialize ожидает аргументы.Я стараюсь избегать обработки карты атрибутов, которая может быть передана в Backbone Model при инициализации, но если BaseModel на самом деле был View или Collection, то я мог бы захотеть установить параметры.

var MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
0 голосов
/ 24 августа 2014

вот метод callSuper мульти поколения, просто добавьте его в свой расширяющий класс.

callSuper: function (methodName) {
    var previousSuperPrototype, fn, ret;

    if (this.currentSuperPrototype) {
        previousSuperPrototype = this.currentSuperPrototype;
        // Up we go
        this.currentSuperPrototype = this.currentSuperPrototype.constructor.__super__;
    } else {
        // First level, just to to the parent
        this.currentSuperPrototype = this.constructor.__super__;
        previousSuperPrototype = null;
    }

    fn = this.currentSuperPrototype[methodName];

    ret = (arguments.length > 1) ? fn.apply(this, Array.prototype.slice.call(arguments, 1)) : fn.call(this);

    this.currentSuperPrototype = previousSuperPrototype;

    return ret;
}
0 голосов
/ 23 января 2012

Возможно, вы захотите переписать свой код, используя функциональное наследование.

var BackBone=function(){
    var that={};

    that.m1=function(){

   };
   return that;

};

var MyModel=function(){

 var that=BackBone();
 var original_m1=that.m1;

//overriding of m1
 that.m1=function(){
    //call original m1
 original_m1();
 //custom code for m1
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...