2012-08-16 23 views
7

Omurga kitaplığının dahili olarak nasıl çalıştığını anlamaya çalışan ve birileri bazı zorlukları çözmemde bana yardımcı olacaksa, derinlemesine takdir edeceğim, orta düzey bir javascript geliştiricisiyim. işteomurga nesnesini ve sınıf oluşturma desenini açıkla

i omurga içerisine yapıcı fonksiyonunun

temel tanım

Backbone.Model = function(attributes, options) { } 

sonra onlar bizim şantiye prototip ortak özellikler eklemek için yöntem uzatmak genel amaçlı kullanmak anlamak budur.

_.extend(Backbone.Model.prototype, Backbone.Events, {...}) 

şimdi bu kısmı kadar ben gerçekleşiyor ve kodunu

var user = new Backbone.Model() 

aşağıdaki olsa yeni bir nesne örneğini mutlu olurdu tam olarak ne olduğunu ve bu i zorlu

bulma am parçasıdır Tabii ki, omurgada bir nesneyi başlatmamızın yolu değil ama biz

ve

Backbone.Model.extend = extend; 

var extend = function(protoProps, classProps) { 
     var child = inherits(this, protoProps, classProps); 
     child.extend = this.extend; 
     return child; 
}; 

var inherits = function(parent, protoProps, staticProps) { 
    var child; 
    if (protoProps && protoProps.hasOwnProperty('constructor')) { 
     child = protoProps.constructor; 
    } else { 
     child = function() { 
      return parent.apply(this, arguments); 
     }; 
    } 
    _.extend(child, parent); 
    ctor.prototype = parent.prototype; 
    child.prototype = new ctor(); 
    if (protoProps) _.extend(child.prototype, protoProps); 
    if (staticProps) _.extend(child, staticProps); 
    child.prototype.constructor = child; 
    child.__super__ = parent.prototype; 
    return child; 
}; 

fonksiyonunu miras içinde neler ve hangi bana neler açıklayınız omurga kodunda

+0

Omurga yorumlarla kaynağı vardır: http://documentcloud.github.com/backbone/docs/backbone.html devralır yöntemle arayın. Güzel bir açıklaması var. ben hala bu kod bloğu ile oldukça karıştı rağmen harika açıklama için – jForrest

cevap

10

alt çizgi en extend işlevi ikinci üyeleri (fonksiyonları ve özellikleri) birleştirir yöntem yaklaşımı uzatmak yarar olduğunu ilk argüman. Örneğin: satıcılar nesnesi değiştirilmeden kalır

/* 
    { 
     age: 29, 
     languages: [ "javascript", "actionscript" ], 
     name: "Jonny", 
     sayHi: <<function>> 
    } 
*/ 
console.dir(receiver); 

Not bu ve alıcı nesne:

var reciever = { 
    name: "Jonny", 
    age: 29 
}; 

var supplier: { 
    languages: [ "javascript", "actionscript" ]; 
    sayHi: function() { 
     console.log("Hi, name name is " + this.name); 
    } 
}; 

_.extend(receiver, supplier); 

yukarıdaki kod çalıştırıldıktan sonra, alıcı bir amacı, bu gibi görünür artık (modifiye edilmiş) ve büyüyeceği Tedarikçiden tüm özellikleri ve fonksiyonları kazanır. Bu işlem genellikle mixin olarak adlandırılır ve işlevleri yeniden tanımlamaktan kaçınmak için kullanılır (daha geniş bir programlama ilkesinin parçası olarak DRY - Don't Repeat Yourself'u bilir).

Şimdi omurga en Model.extend işlevindeki gibi, bu size işin büyük bölümünü yapıyor iç inherits fonksiyonu ile modelinizin yeni örneklerini oluşturmak için kullanılabilecek bir Oluşturucu İşlevini dönmek için bir factory method gibi davranır. inherits fonksiyon, bir verilen nesne ve bir ebeveyn arasında bir inheritance chain (bu özel durumda, Backbone.Model nesnesi) ayrıca mixin kavramı bir adım alır.

var child; 
if (protoProps && protoProps.hasOwnProperty('constructor')) { 
    child = protoProps.constructor; 
} else { 
    child = function() { 
     return parent.apply(this, arguments); 
    }; 
} 

Bu ilk kod bloğu sağlanan nesne karma içinde bir yapıcı işlev bulmaya çalışıyor; Eğer mevcut değilse, o zaman size verilen argümanları otomatik olarak Backbone.Model 'un kendi constructor function' a ileten yeni bir Oluşturucu işlevi oluşturur.

_.extend(child, parent); 

Sonra yapıcı işlevi özellikleri ve işlevleri temin karma tüm özellikler ve işlevler mixin yöntemi uzanan 's çizgi çağrı; Bu, oluşturduğunuz her örneğin kendi verilerine sahip olmasını sağlar (örneğin: özellikler statik değildir ve oluşturduğunuz tüm örneklerde paylaşılır).

ctor.prototype = parent.prototype; 
child.prototype = new ctor(); 
if (protoProps) _.extend(child.prototype, protoProps); 
if (staticProps) _.extend(child, staticProps); 
child.prototype.constructor = child; 
child.__super__ = parent.prototype; 

Bu son blok en heyecan verici ve taze oluşturulan Yapıcı işlevinin prototipine ve ebeveyn (Backbone.Model) nesnenin prototip arasında bir ilişki oluşturur. Bunu yaparak, Kurucu tarafından iade edilen tüm yeni örnekler, prototip zincirinden çözüldükleri için her zamanki omurga Modeli yöntemlerini (yani: get ve set) içerecektir. Bu kod bloğu hakkında daha fazla bilgi edinmek isterseniz, Douglas Crockford's article on Prototypal inheritance başlamak için harika bir yerdir.

Bu yaklaşımın nokta örneğin, ortaya çıkan yapıcı işlevi bir plan olarak kullanacağı özellikleri ve işlevi karmasını tedarik sağlayan olmasıdır:

var Person = Backbone.Model.extend({ 
    name: "Jon Doe", 
    sayHi: function() { 
     console.log("Hi, my name is " + this.get("name")); 
    } 
}); 

Şimdi örneğini her Person nesne olacak bir name mülkiyet ve sayHi fonksiyonu, örneğin hem:

var dave = new Person(); 
dave.sayHi(); // "Hi, my name is Jon Doe" 

dave.set("name", "Dave"); 
dave.sayHi(); // "Hi, my name is Dave" 

// You can also supply properties when invoking the constructor. 
var jimmy = new Person({ name: "Jimmy" }); 
jimmy.sayHi(); // "Hi, my name is Jimmy" 
+0

sayesinde 'if (protoProps && protoProps.hasOwnProperty ('kurucu')) { çocuk = protoProps.constructor; } ' her zaman nesne değildir ve onu kullanmanın amacı nedir? 'else { child = işlev() { return parent.apply (this, arguments); }; } ' ve bu kod bloğu (staticProps üst, protoProps) Backbone.Model dönen aynıdır argüman nesne, üst parametresi olacak şekilde tekrar kafa karıştırıcı neyin kullanarak zarar sadece 'çocuk = fonksiyonu() {} ' –

+0

Tanımlı omurga yapıcı işlevinizi kullanırsa. aksi takdirde Backbone'un model kurucusunu kullanır. Bu kurucu ayrıca, nesneye giden argümanları da bilmelidir. bu nedenle parent.apply yöntemiyle ebeveyn kurucusunu aramanız gerekir. –