Mengapa membuat fungsi Object.create Global-ish?


8

Saya seorang programmer yang cukup berpengalaman di bidang .NET dan Java, dan saya sudah mulai membaca tentang JavaScript. Saya membeli buku "The Good Parts" karya Douglas Crockford, dan saya langsung menunda beberapa hal.

Salah satunya adalah memodifikasi tipe dasar tanpa perlu:

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);

Jelas membuat fungsi dengan tujuan ini berguna dan menghemat waktu, tetapi MENGAPA DI BUMI dia merekomendasikan membuatnya di Object? Tiga napas yang lalu ia menganut bahwa global adalah jahat, dan kemudian ia melanjutkan ke Object patch monyet. Dia bahkan menguji apakah sudah ada, dan hanya berasumsi bahwa jika beberapa perpustakaan lain melakukannya untuknya implementasinya sama.

Apakah ada alasan untuk tidak membuat ini dalam JS yang setara dengan namespace? yaitu

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

Jangan salah paham, saya pikir tambalan monyet berguna, tapi itu sesuatu yang Anda lakukan ketika ada manfaat yang melekat. Saya tidak melihatnya di sini? Apakah ada satu?


4
1 untuk menanyai Crockford, yang membuat terlalu banyak argumen agama yang sangat kuat (banyak di antaranya juga merupakan ide buruk IMHO).
user949300

7
Ini adalah polyfill. Itu mengisinya di browser lama (ES3).
Benjamin Gruenbaum

Jawaban:


8

Object.createdidefinisikan dalam versi browser yang lebih baru (tidak bisa mengatakan dengan tepat sejak kapan). Anda dapat melihat deskripsinya di jaringan pengembang Mozilla .

Ini hanya polyfill (sangat mirip dengan yang ada di halaman itu, dengan beberapa cek lebih sedikit) untuk dapat menggunakan fungsi yang sama pada browser lama. Pada peramban yang lebih baru, ia sudah didefinisikan sebagai fungsi dan karenanya akan menggunakan versi peramban yang dioptimalkan, sedangkan pada peramban yang lebih lama, peramban itu secara default tidak ditentukan dan akan menggunakan versi ini.


1
dia tidak bertanya di mana itu didefinisikan, tetapi mengapa.
jwenting

1
Crockford Object.createmendahului ES5, jadi jawaban ini secara kronologis salah.
Zirak

1
@Rakak sebelum itu dipanggil begetdan dia mendefinisikannya dalam lingkup apa pun dia berada dan tidak aktif Object- jadi jawaban ini tidak benar-benar salah secara kronologis.
Benjamin Gruenbaum

1
@BenjaminGruenbaum javascript.crockford.com/prototypal.html lihat tepat di akhir - 2008 sebelum ES5
Zirak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.