2013-08-11 24 views
5

Tôi mới vào javascript và bây giờ nghiên cứu nó ...Hai cách khác nhau để làm cho các đối tượng javascript

var person = function() { 
    this.name = "name" 
}; 

var person2 = function() { 
    var obj = {}; 
    obj.name = "name"; 
    return obj; 
}; 

Giả sử chúng ta có hai chức năng hiển thị ở trên. Dường như các đối tượng có thể được tạo bằng cách sử dụng một trong hai hàm. Ví dụ)

var p = new person(); 
var p2 = new person2(); 

Câu hỏi của tôi là: Sự khác biệt giữa người vs person2 là gì? Họ có giống nhau không? Nếu không phải cái nào là cách thích hợp hơn để sử dụng?

Cảm ơn

+1

Hàm đầu tiên là hàm khởi tạo, hàm thứ hai chỉ là một hàm trả về một đối tượng và cũng có thể được gọi mà không có 'new'. Có một sự khác biệt, điều này sẽ trở nên rõ ràng hơn khi bạn đọc về 'mới': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new. –

+0

@FelixKling Ngoại trừ nó * được * gọi là 'mới', thay đổi mọi thứ. –

+0

@Andrew: Không thực sự vì chức năng * rõ ràng * trả về một đối tượng. Gọi nó có hoặc không có 'mới' sẽ không tạo ra sự khác biệt. (Tất nhiên nó tạo ra sự khác biệt cho đến nay 'this' sẽ tham chiếu đến các giá trị khác nhau bên trong hàm, nhưng nó không tạo sự khác biệt cho kết quả của lời gọi hàm). –

Trả lời

2

Cách thông thường để tạo đối tượng là cách đầu tiên.

Cách thứ hai sẽ tạo hai đối tượng và một đối tượng sẽ bị hủy. Một đối tượng sẽ được tạo trước khi hàm được gọi, giống như phương thức đầu tiên, nhưng vì hàm trả về một đối tượng khác, đối tượng đầu tiên sẽ bị loại bỏ và đối tượng trả về sẽ được sử dụng thay thế.

Sự khác biệt quan trọng giữa các phương pháp là phương pháp thứ hai không thể sử dụng mẫu thử nghiệm. Bất cứ thứ gì bạn đưa vào nguyên mẫu của hàm sẽ được áp dụng cho đối tượng kết thúc bị loại bỏ.

+2

Tôi không đồng ý rằng cách đầu tiên là bình thường. Tôi nghĩ cách thông thường là 'var p2 = {name:" name "};', có thể với đối tượng được trả về bởi một hàm nếu nó được sử dụng ở nhiều nơi. –

+0

@PeterOlson: Đó là cách thông thường để sử dụng từ khóa 'mới'. Nếu bạn không muốn làm điều đó, đó là một vấn đề hoàn toàn khác. – Guffa

+0

Tôi đồng ý với bạn ở đó, nhưng tôi nghĩ rằng nó gây nhầm lẫn để nói đó là cách bình thường để tạo một đối tượng. –

1

Sự khác biệt là cách bạn sử dụng các chức năng.

Giá trị đầu tiên được sử dụng làm phương tiện xây dựng , this được đặt thành đối tượng mới được tạo. Nó được thiết kế để được sử dụng kết hợp với các nhà điều hành new, như sau:

var bill = new person(); 

Đây là giống như một nhà xây dựng bình thường như trong ngôn ngữ OOP điển hình.


thứ hai được thiết kế để được sử dụng như một chức năng bình thường (không có new), ví dụ .:

var bill = person(); 

Bạn có thể sử dụng cách này của đối tượng sáng tạo kết hợp với builder pattern.

+0

Đáng chú ý là phần thứ hai không kế thừa từ nguyên mẫu của nhà xây dựng (hiển nhiên, nhưng một sự thay đổi đáng chú ý). –

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