[javascript] سوبر في العمود الفقري



4 Answers

يمكنك أيضًا استخدام الخاصية __super__ التي تمثل مرجعًا إلى النموذج الأولي للفئة الرئيسية:

var MyModel = Backbone.Model.extend({
  clone: function(){
    MyModel.__super__.clone.call(this);
  }
});
Question

عندما clone() طريقة clone() في Backbone.Model ، فهل هناك طريقة لاستدعاء طريقة الغالب هذه من عملية الغرس الخاصة بي؟ شيء من هذا القبيل:

var MyModel = Backbone.Model.extend({
    clone: function(){
        super.clone();//calling the original clone method
    }
})



أعتقد أنه يمكنك تخزين الطريقة الأصلية (على الرغم من عدم اختبارها):

var MyModel = Backbone.Model.extend({
  origclone: Backbone.Model.clone,
  clone: function(){
    origclone();//calling the original clone method
  }
});



في حالة أنك لا تعرف ما هي فئة الأصل تمامًا (توارثة متعددة أو إذا كنت تريد وظيفة مساعد) ، فيمكنك استخدام ما يلي:

var ChildModel = ParentModel.extend({

  initialize: function() {
    this.__proto__.constructor.__super__.initialize.apply(this, arguments);
    // Do child model initialization.
  }

});

مع وظيفة المساعد:

function parent(instance) {
  return instance.__proto__.constructor.__super__;
};

var ChildModel = ParentModel.extend({

  initialize: function() {
    parent(this).initialize.apply(this, arguments);
    // Do child model initialization.
  }

});



إذا كنت تريد فقط أن نسمي هذا ._super ()؛ دون تمرير اسم الوظيفة كوسيطة

Backbone.Controller.prototype._super = function(){
    var fn = Backbone.Controller.prototype._super.caller, funcName;

    $.each(this, function (propName, prop) {
        if (prop == fn) {
            funcName = propName;
        }
    });

    return this.constructor.__super__[funcName].apply(this, _.rest(arguments));
}

من الأفضل استخدام هذا البرنامج المساعد: https://github.com/lukasolson/Backbone-Super




2 وظائف أدناه ، واحد يتطلب منك أن تمر في اسم الدالة ، والآخر يمكن "اكتشاف" التي نريد إصدار سوبر

Discover.Model = Backbone.Model.extend({
       _super:function(func) {
        var proto = this.constructor.__super__;
        if (_.isUndefined(proto[func])) {
            throw "Invalid super method: " + func + " does not exist in prototype chain.";
        }
        return proto[func].apply(this, _.rest(arguments));
    },
    _superElegant:function() {
        t = arguments;
        var proto = this.constructor.__super__;
        var name;
        for (name in this) {
            if (this[name] === arguments.callee.caller) {
                console.log("FOUND IT " + name);
                break;
            } else {
                console.log("NOT IT " + name);
            }
        }
        if (_.isUndefined(proto[name])) {
            throw "Super method for: " + name + " does not exist.";
        } else {
            console.log("Super method for: " + name + " does exist!");
        }
        return proto[name].apply(this, arguments);
    },
});



Related