2012-05-11 40 views
23

Mã JavaScript sau đây rất khó hiểu với tôi. Bất cứ ai có thể giúp tôi hiểu. Tại sao PersonY không có thuộc tính mẫu thử nghiệm.Sự khác biệt JavaScript giữa chức năng và chức năng mới

PersonX = function(){}; 
PersonY = new function(){}; 
alert(PersonX.prototype); 
alert(PersonY.prototype);  
​ 
+0

Sử dụng 'hàm', không phải' hàm mới'. –

+0

Chỉ cần làm [không bao giờ sử dụng cấu trúc thứ hai] (http://stackoverflow.com/q/10406552/1048572). – Bergi

Trả lời

33
PersonX = function(){}; 

Places một tham chiếu đến một chức năng ẩn danh vào PersonX. PersonX trỏ đến một hàm.

PersonY = new function(){}; 

Đặt tham chiếu đến thể hiện mới được xây dựng của hàm tạo hàm ẩn danh vào PersonY. PersonY trỏ đến một đối tượng.


Về mẫu thử nghiệm, PersonY có một. Tuy nhiên, vì không có thuộc tính và phương thức nào được đính kèm với hàm tạo before cũng không phải là after instantiation, nó có một mẫu thử nghiệm trống *.

Bạn thực sự có thể kiểm tra nguyên mẫu của PersonY bằng cách thực hiện console.log(PersonY). Bạn sẽ thấy rằng nó có một thuộc tính mẫu (tôi thấy nó là __proto__ trong Chrome) là "trống". Nhưng nó có 2 thuộc tính ẩn, constructor là hàm tạo đã tạo đối tượng và __proto__ khác dẫn bạn đến "chuỗi liên kết" tiếp theo sẽ là đối tượng Object.

* Không thực sự trống vì nguyên mẫu là một chuỗi. Mức nguyên mẫu này có thể trống, nhưng nguyên mẫu cao hơn tiếp theo có thể có, hoặc trong trường hợp này, không có các thuộc tính và phương thức.

Object prototype -> Constructor prototype -> Your Instance will have: 
- toString()  - blank     - toString() 
- hasOwnProperty()       - hasOwnProperty() 
- and more...        - and more... 
              - ...but nothing from Constructor 
+0

Có. 'typeof new function() {} =>" object "' –

+0

Cảm ơn, câu trả lời và nhận xét @Joseph thực sự hữu ích. – riship89

+0

có hoặc hai sintax là tốt hơn cho hiệu suất? – rkmax

0

Đó là vì nó thực sự là đối tượng được khởi tạo trong bộ nhớ dưới dạng bản sao của hàm; nguyên mẫu thực sự chỉ có ý nghĩa trong ngữ cảnh của việc tạo ra cá thể, vì vậy một khi nó được tạo ra, không có cấu trúc logic nào cho ý nghĩa của nó.

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