Tại sao tạo một hàm Object.create toàn cầu?


8

Tôi là một lập trình viên khá có kinh nghiệm trong các lĩnh vực .NET và Java và tôi đã bắt đầu đọc về JavaScript. Tôi đã mua cuốn sách "Những phần tốt" của Douglas Crockford và ngay lập tức tôi sẽ bỏ qua một vài điều.

Một là sửa đổi các loại cơ bản mà không cần:

if (typeof Object.create !== 'function') {
    Object.create = function (o) { //Really... 'o'? For a parameter you're only using twice?
        function F() {}
        F.prototype = o;
        return new F();
    };
}
newObject = Object.create(oldObject);

Rõ ràng việc tạo một chức năng với mục đích này là hữu ích và tiết kiệm thời gian, nhưng TẠI SAO anh ấy lại khuyên bạn nên tạo nó trên Object? Ba hơi thở trước đây anh ta đã tán thành rằng toàn cầu là xấu xa, và sau đó anh ta tiến hành vá khỉ. Anh ta thậm chí còn kiểm tra xem nó đã tồn tại chưa, và chỉ giả định rằng nếu một thư viện khác đã làm điều đó cho anh ta thì việc thực hiện là như vậy.

Có một số lý do để không tạo ra điều này trong JS tương đương với một không gian tên? I E

MY_UNIQUE_UTIL_LIBRARY.create = function(obj){...}; //The name would be shorter in reality.

Đừng hiểu sai ý tôi, tôi nghĩ việc vá khỉ là hữu ích, nhưng đó là việc bạn làm khi có lợi ích vốn có. Tôi không thấy một cái ở đây? Có một cái không?


4
+1 để đặt câu hỏi cho Crockford, người đưa ra quá nhiều tranh luận tôn giáo mạnh mẽ (nhiều trong số đó cũng là những ý tưởng tồi IMHO).
user949300

7
Đó là một polyfill. Nó lấp đầy nó trong các trình duyệt cũ (ES3).
Benjamin Gruenbaum

Câu trả lời:


8

Object.createđược định nghĩa trong các phiên bản mới hơn của trình duyệt (không thể nói chính xác từ khi nào). Bạn có thể xem mô tả của nó trên mạng của nhà phát triển Mozilla .

Đây chỉ là một polyfill (khá giống với cái trên trang đó, với một vài kiểm tra ít hơn) để có thể sử dụng chức năng tương tự trên các trình duyệt cũ hơn. Trên trình duyệt mới hơn, nó đã được xác định là một chức năng và do đó sẽ sử dụng phiên bản tối ưu hóa của trình duyệt, trong khi trên các trình duyệt cũ hơn, nó được xác định theo mặc định và sẽ sử dụng phiên bản này.


1
anh ta không hỏi nó được định nghĩa ở đâu, nhưng tại sao.
jwenting

1
Crockford's Object.createtrước ES5, vì vậy câu trả lời này sai về mặt thời gian.
Zirak

1
@Zirak trước đó nó đã được gọi begetvà anh ấy đã xác định nó trong bất kỳ phạm vi nào anh ấy tham gia và không ở trên Object- vì vậy câu trả lời này không thực sự sai về mặt thời gian.
Benjamin Gruenbaum

1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html xem ngay vào cuối - 2008 là trước ES5
Zirak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.