2011-11-20 19 views
13

Tôi đã xem một video trong đó Crockford bảo chúng tôi không sử dụng từ khóa new. Anh ta nói sử dụng Object.create thay vào đó nếu tôi không nhầm. Tại sao ông nói với chúng ta không sử dụng new nếu anh ta đã sử dụng nó trong việc đạt được thừa kế nguyên chủng trong bài viết này rằng ông đã viết: http://javascript.crockford.com/prototypal.htmlTại sao Crockford lại không sử dụng từ khóa mới nếu ông khuyên chúng ta nên sử dụng nó để thừa kế nguyên mẫu?

tôi mong chờ anh ta sử dụng Object.create thay vì new, như thế này:

function object(o) { 
    return Object.create((function() {}).prototype = o); 
} 

Vậy tại sao anh ấy vẫn sử dụng new?

+1

Có lẽ anh ấy đã học được điều gì đó từ video/bài viết đó? Thật khó để biết nếu không có video/ngữ cảnh. – alexn

+2

Có lẽ là sự kết hợp của A) 'Object.create' không được [hỗ trợ] (http://kangax.github.com/es5-compat-table/) trên một số trình duyệt và B) bài viết đó đã được viết một vài năm trước; phong cách lập trình của anh ấy, giống như hầu hết chúng ta, có lẽ đã thay đổi và phát triển kể từ đó. –

+0

Đây là video: http://www.youtube.com/watch?v=hQVTIJBZook (Tôi không biết chính xác vị trí trong video anh ấy nói, xin lỗi) – 0x499602D2

Trả lời

6

Crockford thảo luận về newObject.create trong this Nov 2008 message to the JSLint.com mailing list. Một đoạn trích:

Nếu bạn gọi một hàm constructor không có tiền tố new, thay vì tạo và khởi tạo một đối tượng mới, bạn sẽ được làm tổn hại đến đối tượng toàn cầu . Không có cảnh báo thời gian biên dịch và không có cảnh báo thời gian chạy . Đây là một trong những phần xấu của ngôn ngữ.

Trong thực tế của tôi, tôi hoàn toàn tránh sử dụng new.

+0

Có lẽ tôi không quen với tất cả các hacks javascript, nhưng tại sao mọi người lại gọi hàm xây dựng mà không có từ khóa 'new'?!? – xmashallax

+0

Điều Crockford * thực sự * nói là nếu bạn bỏ qua * từ khóa mới, bạn sẽ ghi đè đối tượng toàn cục.Đó là nguy cơ bỏ sót nó, đó là lý do tại sao ông khuyên bạn không nên sử dụng nó. Nó là cần thiết cho các đối tượng constructor. – K3N

5

Đây là một câu hỏi thực sự cũ, nhưng ...

Khi Crockford viết the article you mentionthe discussion linked by Paul Beusterien, không có Object.create. Đó là năm 2008 và Object.create, nhiều nhất là một đề xuất (hoặc thực sự hiếm khi được thực hiện trong trình duyệt).

xây dựng chính thức của ông về cơ bản là một polyfill:

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 

newObject = Object.create(oldObject); 

sử dụng duy nhất của ông của new Do đó, để mô phỏng (hay bắt chước) những gì Object.create phải làm.

Anh ấy không khuyên chúng tôi sử dụng. Ông trình bày một polyfill sử dụng nó, vì vậy bạn không phải sử dụng nó ở bất cứ nơi nào khác.

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