2012-01-06 7 views
5

Kendi bel kemiğimi Görüntüle. Görünüm. Eğer süper sınıf 'initialize fonksiyonunda, şunu yazarım:Neden benim Backbone.View.constructor .__ super__ undefined kullanıyorum _.bindAll (this)

_.bindAll (this,' many ',' methods '); süper sınıfta, ben kullanırsanız,

this.constructor.__super__.initialize.apply(this, arguments); 

Ama:

Ve bu bağlamda bağlamak istediğiniz yöntemleri belirlemek, ben üzerinden alt sınıf süper çağırabilir

_.bindAll(this) 
Ben, benim alt sınıf gelen süper aramaya giderken

yerine,

this.constructor.__super__ 

tanımlanmamıştır. Neden olduğu hakkında bir bilgelik var mı?

+0

Eğer işaret etmek çalıştığımız şey emin, ben bunun için bir jsfiddle başladı değil, ancak alt çizgi en bağlama yöntemi ile GÜNCEL konularla tamamlamak olabilir? http://jsfiddle.net/saelfaer/7fCbT/ – Sander

cevap

3

basitçe süper aramak için bu kullanmayın Neden:

(ben açıklama birkaç satıra ayırarak ediyorum, sen tek satırda çağrı yapabilir)

var thisProto = Object.getPrototypeOf(thisInstance); 
var superProto = Object.getPrototypeOf(thisProto); 
superProto.superMethod.apply(thisInstance, [param1, param2]); 

Reference: GetPrototypeOf

1

ben Yapıcıyı döndüren ve _.bindAll öğesine bağışıklık kazandıran getConstructor() ile Omurga yamalı.

Kullanımı:

this.getConstructor().__super__; 

Uygulama: Sadece bu soruna çözüm ancak açıklamalar var olarak gören

(function() { 
    var backboneExtend = Backbone.Model.extend; 
    var constructorExtend = function() { 
    var child = backboneExtend.apply(this, arguments); 
    child.prototype.getConstructor = function() { 
     return child; 
    }; 
    return child; 
    }; 
    Backbone.Model.extend = Backbone.Collection.extend = Backbone.Router.extend = Backbone.View.extend = constructorExtend; 
})(); 
2

, ben ... birini tedarik girişimi için gidiyorum

Underscore's bindAll yöntemi, tek argümanla (nesne) çağrıldığında, o nesnenin tüm işlev türü özellikleri, artık orijinal işlevine başvurmaz; içeriği düzelten başka bir şey.

Nesnenin type işlevinin özelliklerinden biri, Backbone yapıcısı işlevine (__super__ özelliği ile) bir referans olan constructor olduğundan, özelliğin yeni bir işlevle üzerine yazılır. Bu, object.constructor'un artık bir __super__ mülküne sahip olmayacağı anlamına gelir. Bu soruna geçici bir çözüm için

vurgulamaya en bindAll alternatif olarak aşağıdaki işlevi kullandı:

function safeBindAll(obj) { 
    var funcs = Array.prototype.slice.call(arguments, 1); 

    if (funcs.length == 0) { 
     funcs = _.functions(obj); 
    } 

    _.each(funcs, function(f) { 
     var oldProps = obj[f]; 
     obj[f] = _.bind(obj[f], obj); 

     _.extend(obj[f], oldProps); 
    }); 

    return obj; 
} 

Bu alt çizgi versiyonu neredeyse aynı ama _.extend() kullanımı yoluyla yeni işleve orijinal fonksiyonun herhangi özelliklerini ekler .

0

Omurgaya yeni geldim ama bir yöntem ile bir nesneyi içeren bir nesneyi iletmenizi beklediğiniz başka bir çerçeve ile 4 yılı aşkın deneyime sahibim, ama sorun şu ki, bu işlem yeteri kadar ince taneli kontrol sağlamaz. geçirilmekte olan nesne içinde bulunan yöntemler.

Daha fazla denetim elde etmek için genişletmek üzere bir kapatma geçirebilirsiniz ve kapatma bir nesneyi geri gönderebilir. Bu teknik genel olarak daha hassas kontrol ve daha fazla potansiyele sahip olma potansiyeline sahiptir ve spesifik sorununuzu çözmek için kullanılabilir.

  1. Omurga özgü, örneğin: yöntemleri döner kapağın içinde

    , bu yöntemler, iki geniş kategoriye ayrılabilir Yapıcı & biz kendi ayrı nesneden bizim uygulamaya özgü özel yöntemleri dönerseniz uygulamanıza

özgü

  • Custom, başlatmak, biz o zaman _.bindAll ait "kısmi uygulaması" için _.bind kullanabilirsiniz sadece bu özel yöntem isimlerine.

    sonra Hepsini bir araya getirirsek:

    var foobar = Backbone.Model.extend(function() { 
        var foobarMethods = modelMethods(); 
    
        return _.extend({}, foobarMethods, { 
         constructor: function() { 
          _.bind(_.bindAll, this, _.keys(foobarMethods)); 
          // equivalent to _.bindAll(this, 'foo', 'bar') except that the above 
          // allow methods to be arbitrarily added or removed 
         }, 
         initialize : function() {}   
        }); 
    
        //It's possible to "mixin" these methods from another file 
        function modelMethods() { 
         return { 
          foo: function() {}, 
          bar: function() {}, 
         } 
        } 
    }()); 
    
  • İlgili konular