Kata pengantar
Melalui metode call (), apply () dan bind (), kita dapat dengan mudah meminjam metode dari objek lain tanpa mewarisinya dari objek ini.
Metode pinjaman dalam javascript
Dalam JavaScript, fungsi atau metode objek lain kadang -kadang dapat digunakan kembali, tidak harus didefinisikan pada objek itu sendiri atau pada prototipe. Melalui metode Call (), Apply () dan Bind (), kita dapat dengan mudah meminjam metode dari objek lain tanpa mewarisinya. Ini adalah metode umum yang digunakan oleh pengembang javascript profesional.
Metode prototipe
Dalam JavaScript, kecuali untuk tipe data primitif yang tidak dapat diubah, seperti string, angka, dan boolean, hampir semua data adalah objek. Array adalah objek yang cocok untuk melintasi dan mengonversi urutan yang dipesan. Prototipe-nya memiliki metode yang mudah digunakan seperti Slice, Joint, Push dan Pop.
Contoh umum adalah bahwa ketika kedua objek dan array adalah struktur data jenis daftar, objek dapat "meminjam" metode dari array. Metode yang paling umum untuk meminjam adalah Array.prototype.slice .
function myfunc () {// error, argumen adalah objek seperti array, bukan array array nyata.sort (); // "Pinjam" Metode array mengiris dari prototipe, yang mengambil objek seperti array (tombol: value) // dan mengembalikan array nyata var args = array.prototype.slice.call (argumen); // Args sekarang merupakan array nyata, sehingga dapat menggunakan metode sort () dari array args.sort (); } myfunc ('pisang', 'ceri', 'apel');Metode pinjaman berfungsi karena panggilan dan menerapkan metode memungkinkan fungsi panggilan dalam konteks yang berbeda, yang juga merupakan cara yang baik untuk menggunakan kembali fungsi yang ada tanpa harus mewarisi objek lain. Faktanya, array mendefinisikan banyak metode umum dalam prototipe, seperti bergabung dan filter:
// Ambil string "abc" dan menghasilkan "a | b | carray.prototype.join.call ('abc', '|'); // ambil string dan hapus semua non vowelsarray.prototype.filter.call ('abcdefghijk', function (val) {return ['a). ! == -1;}). Gabung (''); Dapat dilihat bahwa tidak hanya objek yang dapat meminjam metode array, tetapi juga string. Tetapi karena metode generik didefinisikan pada prototipe, Anda harus menggunakan String.prototype atau Array.prototype setiap kali Anda ingin meminjam metode. Menulis seperti ini sangat bertele -tele dan akan segera menjadi menjengkelkan. Cara yang lebih efisien adalah dengan menggunakan literal untuk mencapai tujuan yang sama.
Menggunakan metode pinjaman literal
Literal adalah struktur sintaks yang mengikuti aturan JavaScript, MDN menjelaskannya seperti ini:
Dalam JavaScript, menggunakan literal dapat mewakili nilai. Mereka adalah nilai tetap, baik variabel, atau diberikan secara harfiah dalam skrip.
Literal dapat disingkat sebagai prototipe:
[] .slice.call (argumen); []. goint.call ('abc', '|'); ''.Ini sepertinya tidak begitu bertele -tele, tetapi masih agak jelek harus beroperasi langsung pada [] dan "" untuk meminjam metode. Anda dapat menggunakan variabel untuk menyimpan referensi ke literal dan metode, yang membuatnya lebih mudah untuk ditulis:
var slice = [] .slice; slice.call (argumen); var join = [] .join; gount.call ('abc', '|'); var ToUppercase = '' .Touppercase; Touppercase.call (['huruf', 'kata', 'di', 'a', 'kalimat']). split (',');Dengan referensi untuk metode pinjaman, kita dapat dengan mudah menyebutnya dengan panggilan (), yang juga dapat menggunakan kembali kode tersebut. Mematuhi prinsip mengurangi redundansi, mari kita lihat apakah kita dapat meminjam metode tanpa harus menulis panggilan () atau menerapkan () setiap kali kita menelepon:
var slice = function.prototype.call.bind (array.prototype.slice); slice (argumen); var join = function.prototype.call.bind (array.prototype.join); gabungkan ('abc', '|'); var toupercase = function.prototype.call.bind (string.prototype.touppercase); Toupercase (['huruf kecil', 'kata', 'di', 'a', 'kalimat']). split (','); Seperti yang Anda lihat, Anda sekarang dapat menggunakan Function.prototype.call.bind untuk secara statis mengikat metode "dipinjam" dari berbagai prototipe. Tetapi bagaimana kalimat var slice = Function.prototype.call.bind(Array.prototype.slice) sebenarnya berfungsi?
Memahami function.prototype.call.bind
Function.prototype.call.bind mungkin tampak agak rumit pada pandangan pertama, tetapi bisa sangat membantu untuk memahami cara kerjanya.
Function.prototype.call adalah referensi yang "memanggil" fungsi dan akan mengatur nilai "ini" untuk digunakan dalam suatu fungsi.
Perhatikan bahwa "Bind" mengembalikan fungsi baru dengan nilai "ini". Oleh karena itu, "ini" dari fungsi baru yang dikembalikan oleh .bind(Array.prototype.slice) selalu merupakan fungsi array.prototype.slice.
Singkatnya, fungsi baru menyebut fungsi "panggilan", dan "ini" adalah fungsi "irisan". Memanggil SLICE () akan menunjuk ke metode yang sebelumnya memenuhi syarat.
Metode untuk menyesuaikan objek
Warisannya bagus, tetapi pengembang biasanya menggunakannya ketika mereka ingin menggunakan kembali beberapa fitur umum antara objek atau modul. Tidak perlu menggunakan warisan hanya untuk penggunaan kembali kode, karena metode pinjaman sederhana dapat rumit dalam banyak kasus.
Kami hanya membahas metode pinjaman asli sebelumnya, tetapi meminjam metode apa pun tidak apa -apa. Misalnya, kode berikut dapat menghitung skor pemain permainan poin:
var scorecalculator = {getsum: function (hasil) {var skor = 0; untuk (var i = 0, len = results.length; i <len; i ++) {skor = hasil+hasil [i]; } skor pengembalian; }, getScore: function () {return scorecalculator.getSum (this.Results) / this.handicap; }}; var player1 = {hasil: [69, 50, 76], handicap: 8}; var player2 = {hasil: [23, 4, 58], handicap: 5}; var skor = function.prototype.call.bind (scorecalculator.getScore); // skor: 24.375console.log ('skor:' + skor (player1)); // skor: 17console.log ('skor:' + skor (player2));Meskipun contoh di atas sangat tumpul, dapat dilihat bahwa seperti metode asli, metode yang ditentukan pengguna dapat dengan mudah dipinjam.
Meringkaskan
Panggilan, ikat, dan berlaku dapat mengubah cara fungsi dipanggil dan sering digunakan saat meminjam fungsi. Sebagian besar pengembang terbiasa dengan meminjam metode asli, tetapi jarang meminjam metode khusus.
Dalam beberapa tahun terakhir, pemrograman fungsional Javascript telah berkembang dengan baik. Bagaimana cara menggunakan function.prototype.call.bind untuk meminjam metode yang lebih nyaman? Diperkirakan topik seperti itu akan menjadi semakin umum.
Di atas adalah ringkasan metode pinjaman dalam JavaScript. Saya harap akan sangat membantu bagi semua orang untuk memahami metode pinjaman dalam JavaScript.