2011-08-23 52 views
9

Tôi thường trong dự án của tôi tạo lớp của tôi theo cách này ... Object literal.Giải thích nguyên mẫu JavaScript cần thiết

var objectName = { 

    //global variables 
     a : 'somevalue', 

     func1: function(){ 

     }, 


     func2: function(){ 

     } 

} 

Nếu tôi phải biến điều này thành định dạng mẫu, tôi sẽ làm như thế nào?

Điều gì sẽ là lợi thế của tôi khi sử dụng mẫu thử nghiệm hơn cái này, khi công việc được thực hiện với định dạng này.

Tại sao mọi người nói nhiều về nguyên mẫu.

Trả lời

32

Hóa thành một mô hình sẽ giống như thế:

var someObject = function() { 
    this.a = "somevalue"; 
}; 

someObject.prototype.func1 = function() { // work }; 
someObject.prototype.func2 = function() { // work }; 

var myObject = new someObject(); 

một số lợi thế như thế nào? Vâng, có một bó, nhưng có là một số lý do thực sự thực tế khi nguyên mẫu làm cho ý nghĩa hơn so với đối tượng literals .

Đầu tiên là giảm mã trùng lặp; Vì vậy, giả sử bạn muốn một đối tượng khác rất quen thuộc với objectName, nhưng bạn muốn a đến là một giá trị khác. Bạn có lẽ sẽ kết thúc với một cái gì đó như:

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

Và bạn có thể làm giảm các chức năng sao chép bằng cách nói

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: objectName.func1, 
     func2: objectName.func2 
} 

Hoặc, sử dụng một nguyên mẫu, tôi chỉ có thể làm cho nó để tôi có thể vượt qua trong các giá trị Tôi muốn a trong khi xây dựng đối tượng. Mã được cấu trúc lại trông giống như sau:

var someObject = function(a) { 
    this.a = a; 
}; 

someObject.prototype.func1 = function() { /* work */ }; 
someObject.prototype.func2 = function() { /* work */ }; 

var myObject = new someObject("somevalue"); 
var myOtherObject = new someObject("otherValue"); 

Bây giờ, nếu tôi muốn thêm chức năng mới cho cả hai. Sử dụng đối tượng theo nghĩa đen, sau đó bạn sẽ phải nhớ cũng thêm nó vào otherObjectName. Khi số lượng chữ của bạn tăng lên, sẽ mất nhiều thời gian hơn và khó quản lý hơn.

Sử dụng cách tiếp cận nguyên mẫu, tất cả chúng ta sẽ phải nói là:

someObject.prototype.func3 = function() { // do even more work } 

hoặc thậm chí thú vị hơn tôi tự động có thể kéo dài cả hai đối tượng bằng cách chỉ có một tham chiếu đến từng người nói.

// find what function made me, get its prototype, and add a new function to it 
myObject.constructor.prototype.func3 = function() { /* work */ } 
myOtherObject.func3() // tada magic! 

hoặc tôi có thể tạo một đối tượng mới bằng cách chỉ biết tham chiếu. như:

var newObject = myObject.constructor(myObject.a + " new"); 

Bởi vì cả hai myObjectmyOtherObject chia sẻ cùng một constructorprototype, có rất nhiều điều thú vị bạn có thể làm với mối quan hệ đó mà bạn không thể làm với literals đối tượng.

Bạn có thể nghĩ các nguyên mẫu là các nhà máy nhỏ để tạo ra các đối tượng thay vì phải tự tạo mọi đối tượng dưới dạng chữ.

Bây giờ, nếu bạn đang nghĩ, "Vâng, tôi sẽ chỉ có một trong số này và tôi sẽ không thực hiện bất kỳ phương pháp điên nào của bạn ma thuật mở rộng."Sau đó xác định một đối tượng literals là một apporach hoàn toàn hợp lệ cho một số vấn đề. Đôi khi sử dụng một mẫu thử nghiệm là tốt hơn. Sử dụng mẫu có ý nghĩa cho vấn đề mà bạn đang cố gắng để giải quyết, thay vì cố gắng để phù hợp với vấn đề của bạn thành một

+0

giải thích rất hay ... cảm ơn – Anshul

+0

tôi không hiểu: ( –

+0

).) {}; –

Các vấn đề liên quan