2012-02-26 45 views
5

Theo như tôi có thể nói, có hai cách chính để tạo các hàm cho một đối tượng trong javascript. Đó là:Tạo các hàm cho một đối tượng trong javascript

Phương pháp A, làm cho nó trong các nhà xây dựng:

function MyObject() { 
    this.myFunc1 = function() { 
     ... 
    } 
    this.myFunc2 = function() { 
     ... 
    } 
    ... 
} 

Phương pháp B, thêm nó vào nguyên mẫu:

function MyObject() { 
    ... 
} 

MyObject.prototype.myFunc1 = function() { 
    ... 
} 

MyObject.prototype.myFunc2 = function() { 
    .... 
} 

Rõ ràng nếu bạn đã làm:

MyObject.myFunc3 = function() { 
    .... 
} 

sau đó myFunc3 sẽ trở thành liên kết với MyObject chính nó, và không phải bất kỳ đối tượng mới được tạo ra với new từ khóa. Để rõ ràng, chúng ta sẽ gọi nó là phương thức C, mặc dù nó không hoạt động để tạo các đối tượng mới với từ khóa new.

Vì vậy, tôi muốn biết sự khác biệt giữa hai loại này là gì. Theo như tôi có thể nói họ có cùng một hiệu quả một cách hợp lý, ngay cả khi những gì đang xảy ra trên máy thì khác.

Nếu tôi đoán tôi sẽ nói rằng điểm khác biệt duy nhất là khi bạn định nghĩa chúng trong hàm tạo như trong phương thức A, nó tạo đối tượng hàm hoàn toàn mới cho từng đối tượng được tạo và phương thức B chỉ giữ một bản sao của nó (trong MyObject), mà nó đề cập đến bất cứ lúc nào nó được gọi. nếu đây là trường hợp, tại sao bạn sẽ làm điều đó một cách trên khác. Nếu không, sự khác biệt giữa phương pháp A và phương pháp B.

+0

Bạn cũng có thể tạo các chức năng trong các đối tượng như [this] (http://jsfiddle.net/uwv5a/) –

+0

đọc về mẫu mô-đun: http://www.engfers.com/code/javascript-module-pattern/ – bryanmac

+0

@CoreyFarwell, tôi cho rằng về cơ bản cũng giống như Phương pháp A, phải không? –

Trả lời

4

Lợi thế của việc đưa ra một hàm riêng biệt cho từng đối tượng là bạn có thể đóng các biến trong hàm tạo, về cơ bản cho phép "dữ liệu riêng tư".

function MyObject(a,b) { 
    var n = a + b; //private variable 
    this.myFunc1 = function() { 
     console.log(n); 
    } 
}; 

vs

function MyObject(a,b) { 
    this.n = a + b; //public variable 
} 

MyObject.prototype.myFunc1 = function() { 
    console.log(this.n); 
} 

Cho dù đây là một ý tưởng tốt hay không phụ thuộc vào người bạn hỏi. Lập trường cá nhân của tôi là đặt các hàm dựng cho khi tôi thực sự sử dụng nguyên mẫu, như trong tùy chọn # 2 và sử dụng các hàm đơn giản (ví dụ: make_my_object(a,b)) khi sử dụng các bao đóng, như trong tùy chọn # 1.

2

Ý tưởng là bạn có thể sửa đổi nguyên mẫu bất kỳ lúc nào và tất cả các đối tượng thuộc loại (ngay cả những đối tượng được tạo trước khi sửa đổi) sẽ kế thừa các thay đổi. Điều này là bởi vì, như bạn đã đề cập, nguyên mẫu không được sao chép với mọi cá thể mới.

0

MyObject trong phương pháp A là một ví dụ cho các chức năng bên trong. Bạn không thể gọi hàm của nó một cách rõ ràng bên ngoài nó trừ khi đối tượng (bạn có thể gọi nó là một lớp) đã được khởi tạo.

Giả này:

MyObject.MyFunc1(); // will not work 
var obj = new MyObject(); 
obj.MyFunc1(); // will work 

vì vậy đây là giống như bất kỳ lớp bằng các ngôn ngữ khác. Việc mô tả tính hữu ích của các lớp học và cách sử dụng của chúng vượt xa câu hỏi đó.

Ngoài ra cần chú ý:

function MyObject() { 
     var privateVar = "foo"; 

     this.publicProperty = "bar"; 

     // public function 
     this.publicFunc = function() { 
      ... 
     } 

     // private function 
     function privateFunc() { 
      ... 
     } 
    } 

Đối phương pháp B nó giống như với phương pháp A, sự khác biệt duy nhất là tạo mẫu là một phong cách tạo đối tượng. Một số sử dụng nguyên mẫu để dễ đọc hoặc không được ưu tiên. Ưu điểm chính trong nguyên mẫu là bạn có thể mở rộng đối tượng hiện có mà không cần chạm vào nguồn gốc. Bạn cần phải cẩn thận với điều đó mặc dù. (ví dụ: Khuôn mẫu nguyên mẫu)

Phương thức C bạn có thể gọi cho chúng là hàm tĩnh. Như bạn đã nói, chúng có thể được gọi một cách rõ ràng bằng cách tham chiếu qua đối tượng như:

MyObject.MyFunc1(); 

Vì vậy, cái nào để sử dụng tùy thuộc vào tình huống bạn đang xử lý.

+0

Trong phương pháp B, các phương thức cũng là các phương thức thể hiện. Bạn có bị nhầm lẫn với phương pháp "giả mạo C" giả định và không gắn nhãn của mình không? – hugomg

+0

@missingno Tôi thấy bạn là quan điểm. Tôi đã gắn nhãn nó là phương thức c, mặc dù nó không thực sự hiệu quả trong việc tạo các đối tượng mới với từ khóa 'new'. –

+0

@missingno vâng, xin lỗi. Bằng cách nào đó tạo mẫu đã trượt trước mắt tôi. Câu trả lời đồng ý –

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