2012-01-20 2 views
7

tôi muốn làm:Khi mở rộng mô hình xương sống hoặc chế độ xem, làm cách nào tôi có thể tạo các thuộc tính được tạo trên cá thể chứ không phải trên mẫu thử nghiệm?

var MyModel = Backbone.model.extend({ 
    someProp: { ... }, 
    . 
    . 
    }); 

nhưng có new MyModel().someProp === new MyModel().someProp trở false

như nếu tôi đã làm

function MyModel() { 
this.someProp = {...}; 
} 

Tôi không muốn đặt nhiệm vụ this.someProp = {...}; trong phương pháp initialize bởi vì nếu i subclass MyModel, tôi sẽ phải lặp lại nhiệm vụ cũng trong phương thức khởi tạo của lớp con một lần nữa hoặc nhớ gọi cho cha mẹ trong itialize từ trẻ em khởi tạo mỗi khi tôi phân lớp, mà nó dường như với tôi như là một workaround chứ không phải là một giải pháp. Vậy, có cách nào khác không?

Trả lời

8

Nếu bạn muốn sử dụng nó cho nhiều mô hình, thì một giải pháp là tạo một hàm độc lập để xử lý nó, sau đó bạn có thể gọi hàm đó từ phương thức khởi tạo của mô hình.

Dưới đây là một ví dụ

function addInstanceProperties() { 
    this.someProp = 'hello'; 
    this.otherProp = 'world'; 
} 

var Parent = Backbone.Model.extend({ 
    initialize: function() { 
    //have to use 'call' so the context is set to this model 
    addInstanceProperties.call(this); 
    } 
}); 

var Child = Parent.extend({ 
    initialize: function() { 
    addInstanceProperties.call(this); 
    } 
}); 

Tuy nhiên, điều này không có gì khác biệt so với việc có những nhiệm vụ bất động sản trong các phụ huynh và có con gọi phương thức khởi tạo của cha mẹ. Và có ít mã hơn.

var Parent = Backbone.Model.extend({ 
    initialize: function() { 
    this.someProp = 'hello'; 
    this.otherProp = 'world'; 
    } 
}); 

var Child = Parent.extend({ 
    initialize: function() { 
    Parent.prototype.initialize.call(this); 
    } 
}); 

Trừ khi bạn muốn lặp lại việc gán thuộc tính trong mỗi phương pháp khởi tạo, đây thực sự là cách duy nhất để làm điều đó trong Javascript.

+0

yeah đây là những gì tôi muốn tránh .. – Paralife

+0

Thật không may là không có cách nào để tránh nó trong javascript – Paul

+0

Ngoài ra, nếu tôi không cần phải thêm bất cứ điều gì để khởi tạo con, tôi cũng có thể bỏ qua định nghĩa khởi tạo con, là chính xác? Tôi có nghĩa là, Nếu tôi không ghi đè khởi tạo trong con của tôi, khởi tạo của cha mẹ sẽ được gọi là, chính xác? – Paralife

0

Tôi thực sự khuyên bạn nên ghi đè hàm tạo trong lớp cha thay vì tạo một hàm riêng biệt như Paul đã đề xuất. Bằng cách đó, nếu bạn cần một hàm khởi tạo tùy chỉnh trong các hàm con, hàm tạo giữ lại các đặc tính cá thể và bạn không cần phải lo lắng về việc quản lý phạm vi hoặc gọi một hàm toàn cầu, đi qua trong ngữ cảnh this, v.v.

var Parent = Backbone.Model.extend({ 
    constructor: function(options){ 
    this.someProp = 'hello'; 
    this.otherProp = 'world'; 
    Backbone.Model.prototype.constructor.apply(this, arguments); 
    } 
}); 

var child = Parent.extend({ 
    initialize: function(){ 
    // don't need to worry about setting up instance props anymore. 
    // don't need to worry about invoking the overridden init method. 
    } 
}); 

Đây là ý tưởng giống như những gì Paul đã thực hiện trong khối mã thứ hai của mình, ngoại trừ việc nhà xây dựng được tách ra từ khởi tạo trong xương sống vì lý do chính xác này - để bạn có thể ghi đè/tùy chỉnh hành động khởi tạo mà không cần để sao chép/dán tùy chọn xây dựng dự phòng mỗi khi bạn làm như vậy.