Rumah >hujung hadapan web >tutorial js >Mengapakah Mengubah Suai [[Prototaip]] Objek merupakan Pembunuh Prestasi dalam JavaScript?

Mengapakah Mengubah Suai [[Prototaip]] Objek merupakan Pembunuh Prestasi dalam JavaScript?

Barbara Streisand
Barbara Streisandasal
2024-10-30 20:09:03536semak imbas

Why is Modifying an Object's [[Prototype]] a Performance Killer in JavaScript?

Mengapa Mengubah Suai [[Prototaip]] Objek Pembunuh Prestasi?

Rangkaian Pembangun Mozilla (MDN) menasihatkan supaya tidak mengubah objek [[Prototaip]], tanpa mengira kaedah yang digunakan. Amaran ini berpunca daripada penalti prestasi ketara yang dikenakan pada pelaksanaan JavaScript moden.

Semasa menambah fungsi ahli pada kelas JavaScript melalui Function.prototype disyorkan, kedua-dua operasi berikut:

foo.__proto__.bar = bar;
Foo.prototype.bar = bar;

adalah fungsian setara dan cipta 'sifat bar pada objek Object.getPrototypeOf(foo)`.

Isunya bukan pada mencipta sifat 'bar`, tetapi dalam menugaskan kepada sifat '__proto__ itu sendiri:

fred.__proto__ = Object.prototype;

Operasi ini memecahkan pengoptimuman enjin JavaScript untuk akses harta benda. Dengan mengubah suai rantai prototaip objek sedia ada, anda secara berkesan memusnahkan sebarang usaha pengoptimuman terdahulu.

Enjin JavaScript V8, contohnya, menggunakan kelas tersembunyi untuk mengoptimumkan carian harta benda. Menukar rantaian prototaip membatalkan pengoptimuman ini, memaksa enjin kembali kepada kaedah yang kurang cekap.

Pakar dalam bidang telah menyatakan kebimbangan tentang implikasi prestasi prototaip boleh ubah:

  • Brendan Eich: "Boleh ditulis proto adalah kesakitan yang besar untuk dilaksanakan... dan ia mewujudkan pelbagai jenis bahaya kekeliruan."
  • Brian Hackett: "Membenarkan skrip untuk memutasi prototaip... menjadikannya lebih sukar untuk membuat alasan tentang kelakuan sesuatu skrip dan menjadikan VM, JIT dan pelaksanaan analisis lebih kompleks dan lebih bugger."
  • Jeff Walden: "Mutasi prototaip selepas penciptaan, dengan ketidakstabilan prestasi yang tidak menentu, dan kesan ke atas proksi dan [[SetInheritance]]"

Konsensus adalah jelas: mengubah [[Prototaip]] objek mengganggu pengoptimuman prestasi dan harus dielakkan. Sebaliknya, mencipta objek baharu dengan rantai prototaip unik menggunakan Object.create() ialah pendekatan pilihan.

Atas ialah kandungan terperinci Mengapakah Mengubah Suai [[Prototaip]] Objek merupakan Pembunuh Prestasi dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn