Dalam JavaScript, kaedah apply() membenarkan untuk menghantar nombor arbitrari argumen sebagai tatasusunan kepada fungsi yang dipratentukan, berpotensi memperluaskan fungsinya. Walau bagaimanapun, apabila digabungkan dengan pengendali baharu, yang penting untuk instantiasi objek, pendekatan ini memberikan cabaran unik: pembina biasanya menjangkakan bilangan argumen tetap.
Soalan saya timbul daripada keinginan untuk mencipta contoh objek menggunakan operator baharu sambil memberikan hujah secara dinamik kepada pembina.
The Halangan:
Pada mulanya, saya berusaha untuk melaksanakan konsep ini:
function Something(){ // Initializations } function createSomething(){ return new Something.apply(null, arguments); } var s = createSomething(a,b,c); //'s' is an instance of Something
Walau bagaimanapun, pendekatan ini terbukti tidak berkesan.
Menangani Isu:
Banyak penyelesaian telah dicadangkan sebagai tindak balas kepada pertanyaan saya, tetapi tiada yang menawarkan integrasi yang lancar bagi apply() dengan pengendali baharu. Penyelesaian alternatif telah dicadangkan, masing-masing mempunyai kelebihan dan kaveat tersendiri.
Penyelesaian Pilihan:
Penyelesaian yang paling sesuai dengan saya, yang dicadangkan oleh Matthew Crumley, menggunakan seorang yang bijak pendekatan menggunakan Function.prototype.bind dan fungsi perantaraan:
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
Ini pendekatan mengelak daripada apply() dan menggunakan fungsi berasingan, F, yang melaksanakan kefungsian yang dimaksudkan.
Satu Pilihan Berdaya maju:
Satu lagi penyelesaian ketara, ditawarkan oleh Simon Lyall, memanfaatkan Function.prototype.bind dan eval():
function createSomething(){ var args = [].slice.call(arguments), constr = eval("new ("+Something.name+"(" + args+ "))"); return constr; }
Sambil elegan dan ringkas, pendekatan ini bergantung pada eval(), yang mungkin menimbulkan kebimbangan mengenai keselamatan dan keserasian merentas persekitaran yang berbeza.
Kesimpulan:
Walaupun kaedah apply() menyediakan cara yang berkuasa untuk mengendalikan bilangan hujah yang dinamik, penyepaduan langsungnya dengan pengendali baharu tetap tidak disokong dalam JavaScript. Sebaliknya, penyelesaian alternatif tersedia untuk mencapai kefungsian yang serupa, membolehkan penciptaan contoh objek yang fleksibel dengan argumen yang berbeza-beza.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar Argumen Secara Dinamik kepada Pembina Menggunakan Operator `baru` dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!