2012-02-01 6 views

Trả lời

74

Có sự khác biệt cơ bản, viết tắt có thể được mô tả là "sự khác biệt giữa dự án của một ngôi nhà và chính ngôi nhà đó ".

Đối với các lập trình viên chuyên gia tôi sẽ chỉ nói rằng "mới Backbone.Model" trả về một trường hợp đối tượng, nhưng "Backbone.Model.extend" trả về một hàm constructor

FIRST: một đối tượng mới (ví dụ: Nhà)

var TestModel = new Backbone.Model({ title: "test title" }); 

bạn tạo đối tượng mới có cấu trúc (phương pháp và biến) đã được xác định ở một nơi khác. Đối tượng có thể được coi là "tất cả các mục không phải là gốc" của một ngôn ngữ, trong đó cho "mục gốc" tôi có nghĩa là các loại cơ bản như số nguyên, ký tự, v.v.

Trong dấu ngoặc {} bạn chuyển giá trị của một số biến hoặc phương pháp. Điều này được gọi là, như Tomasz Nurkiewicz trước đây đã giải thích, một nhà xây dựng, bởi vì nó cho phép bạn 'xây dựng' một đối tượng mới có mô hình đã được mô tả ở nơi khác.

Để cung cấp cho bạn một ví dụ được biết: bạn viết

var myArray = new Array(); 

Nó có nghĩa là bạn đang tạo một mảng mới, mà là một đối tượng phi bản địa mà đã được xác định ở nơi khác. bạn cũng có thể viết:

var myArray = new Array([1,2,3,4,5]); 

Và nó lấp đầy mảng bằng các số đã cho.

THỨ HAI: sửa đổi định nghĩa của đối tượng hiện có (tức làCác dự án của ngôi nhà)

với

var TestModel = Backbone.Model.extend({ title: "test title" }) 

bạn nói điều gì đó rất đơn giản để VM của bạn: "đối tượng bạn đưa cho tôi như mặc định là rất tốt đẹp, nhưng tôi muốn thực hiện nhiều chức năng/tài sản" . Vì vậy, với mệnh đề "extend" bạn sửa đổi định nghĩa của một đối tượng thêm hoặc ghi đè lên phương thức/thuộc tính hiện có.

Ví dụ: ví dụ hay trong backbone.js được đưa ra bởi hàm so sánh của bộ sưu tập. Khi bạn mở rộng đối tượng xác định nó, "nó sẽ được sử dụng để duy trì bộ sưu tập theo thứ tự sắp xếp".

Ví dụ:

myCollection = Backbone.Collection.extend({ 
    comparator:function(){ 
     return item.get('name'); 
    } 
}); 

nói chung

Những gì bạn đang mong đợi để làm khi 'backboning' (đang phát triển sử dụng khuôn khổ backbone.js) được mở rộng đối tượng nhất định (ví dụ một Xem) với:

window.ButtonView = Backbone.View.extend({ 
    btnText:'nothingByDefault', 
    myNewMethod:function(){ 
     //do whatever you want, maybe do something triggered by an event, for instance 
    } 
}); 

và sau đó sử dụng nó ở một nơi khác trong mã, một lần cho mỗi nút bạn muốn xử lý, bao gồm cả trong cú đúp là tất cả các giá trị bạn muốn cung cấp cho các đối tượng

[...] 
var submitBtn = new ButtonView({btnText:"SubmitMe!"}), 
var cancelBtn = new ButtonView({btnText:"Erase All!"}); 

.... Hy vọng điều này sẽ giúp ...

+12

1 cho phép ẩn dụ (dự án của một ngôi nhà vs nhà riêng của mình) :) –

+3

thể bạn nói rằng với "mở rộng" bạn tạo ra một nguyên mẫu, và với "mới" bạn tạo ra một đối tượng từ một mẫu thử nghiệm ?! – netfed

14

Trong trường hợp thứ hai TestModel là một contructor mà bạn có thể sử dụng nhiều lần sau đó để tạo ra một thể hiện của mô hình:

var model = new TestModel(); 

Tuy nhiên qua title để extend có một ý nghĩa khác nhau. Có lẽ bạn nên sử dụng:

var TestModel = Backbone.Model.extend({defaults: { title: "test title" }}); 

hoặc vượt qua các mô hình thuộc tính khi tạo một đối tượng:

var model = new TestModel({ title: "test title" }); 

Trong trường hợp đầu tiên trên Mặt khác TestModel đã là một thể hiện của mô hình (do đó nó nên được đặt tên testModel để thực hiện theo quy ước đặt tên JavaScript):

var testModel = new Backbone.Model({ title: "test title" })