2009-09-14 67 views
11

có thể bất cứ ai xin vui lòng cho tôi biết, ở đâu trong Javascript sự khác biệt giữaSự khác nhau giữa MyClass.prototype = new Object() và MyClass.prototype = Object

MyClass.prototype = new Object(); //or ... = {} 

MyClass.prototype = Object; 

là? Và nếu không có sự khác biệt trong kết quả, cái nào là cách thực hành tốt nhất để đi?

+0

trùng lặp có thể xảy ra (http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here) – Bergi

+1

@Bergi câu hỏi này là hơn 4 tuổi. Người bạn đã liên kết là 2 tuổi ... – moxn

+0

Câu trả lời 1,5 tuổi vẫn hợp lệ và câu hỏi này vẫn được tìm thấy qua tìm kiếm và liên kết. Nó sẽ trỏ đến các câu trả lời hữu ích khác ... – Bergi

Trả lời

11

hai ví dụ đầu tiên của bạn là hoàn toàn tương đương:

MyClass.prototype = new Object(); // empty object 
MyClass.prototype = {}; // empty object 

Ví dụ thứ ba của bạn là không hợp lệ, vì bạn đang gán cho MyClass.prototype một tham chiếu đến các nhà xây dựng Object, và nó là một chức năng, không phải là một đối tượng mới.

Cá nhân tôi thích thứ hai, đối tượng literal hoặc initialiser cú pháp:

MyClass.prototype = {prop1: 'value', prop2: 'value2'}; 
//... 
MyClass.prototype.foo = 'bar'; 
MyClass.prototype.method1: function() {/**/}; 

Edit: Đáp lại bình luận của bạn, một đối tượng rỗng đen { } về cơ bản tương đương với new Object() vì điều này:

Mục tiêu sản xuất: {} là được đánh giá như sau:

  1. Tạo đối tượng mới như thể bằng biểu thức mới Object().
  2. Kết quả trả về (1).

Để biết thêm chi tiết kiểm tra 11.1.5 phần (Object initialiser) của ECMAScript Language Spec (pdf).

Edit: Ví dụ thứ ba sẽ không sản xuất bất kỳ lỗi nào, nhưng là không tốt chút nào, ví dụ bạn có thể dễ dàng clobber hàm xây dựng đối tượng nếu bạn mở rộng sau đó các MyClass.prototype:

MyClass.prototype = Object; 
MyClass.prototype.foo = 'bar'; 

Object.foo === MyClass.prototype.foo; // true 
+0

Hmhm, vì vậy nếu cả hai ví dụ không tạo ra lỗi dưới bất kỳ hình thức nào và về cơ bản làm như vậy (như nó thực sự là), nó chỉ là sự lỏng lẻo của động cơ javascript của trình duyệt cho phép ví dụ thứ hai để làm việc? – moxn

+0

Không, tôi biết rằng {} == đối tượng mới(). Ý tôi là "ví dụ thứ hai" là ... prototype = Object; – moxn

+0

OK, tôi hiểu. Cám ơn vì đã giải thích. – moxn

2

Tùy thuộc vào Object. Nếu đó là một hàm bạn muốn sử dụng phương thức new Object(). Nếu nó là một "lớp ảo" (được định nghĩa bằng cách sử dụng Object = {someProperty: someValue}) thì bạn sử dụng phương thức thứ hai.

Một số gợi ý hơn trong this page trên nguyên mẫu kế thừa trong JavaScript

+1

Liên kết tuyệt vời, nhờ – moxn

0

MyClass.prototype.method1: function() {/ ** /};

Correction các phần trên: nó phải được

MyClass.prototype.method1 = function() {/**/}; 

(Lưu ý dấu bằng sau khi 'method1').

Các thư đại tràng chỉ được sử dụng khi định nghĩa phương pháp là chính nó trong một định nghĩa đối tượng, như: [? Lý do để sử dụng từ khóa 'mới' ở đây là gì]

var myObject = {myVar1: 10, myMethod1: function() { /* */}; 
Các vấn đề liên quan