Alasan utama mengapa saya menginginkannya adalah karena saya ingin memperluas fungsi inisialisasi saya.
Sesuatu seperti ini:
// main.js
window.onload = init();
function init(){
doSomething();
}
// extend.js
function extends init(){
doSomethingHereToo();
}
Jadi saya ingin memperluas fungsi seperti saya memperluas kelas di PHP.
Dan saya ingin memperluasnya dari file lain juga, jadi misalnya saya memiliki fungsi init asli main.js
dan fungsi diperpanjang di extended.js
.
javascript
function
extend
Adam Halasz
sumber
sumber
Jawaban:
Dengan pandangan yang lebih luas tentang apa yang sebenarnya Anda coba lakukan dan konteks di mana Anda melakukannya, saya yakin kami dapat memberikan jawaban yang lebih baik daripada jawaban literal untuk pertanyaan Anda.
Tapi inilah jawaban literal:
Jika Anda menetapkan fungsi-fungsi ini ke beberapa properti di suatu tempat, Anda dapat menggabungkan fungsi asli dan meletakkan penggantinya di properti itu:
Jika fungsi Anda belum ada pada suatu objek, Anda mungkin ingin meletakkannya di sana untuk memfasilitasi hal di atas. Misalnya:
Tapi ada seperti cara yang lebih baik untuk melakukan itu. Seperti misalnya, menyediakan sarana untuk mendaftarkan
init
fungsi.(Banyak hal di atas dapat ditulis sedikit lebih padat, tetapi saya ingin menggunakan nama yang jelas seperti
publicSymbols
daripadapubs
literal objek biasa atau anonim saya . Anda dapat menulisnya lebih ringkas jika Anda ingin memiliki fungsi anonim, tetapi saya tidak ' Tidak terlalu peduli dengan fungsi anonim .)sumber
Ada beberapa cara untuk melakukannya, tergantung apa tujuan Anda, jika Anda hanya ingin menjalankan fungsinya juga dan dalam konteks yang sama, Anda dapat menggunakan
.apply()
:Jika Anda ingin menggantinya dengan yang lebih baru
init
, tampilannya akan seperti ini:sumber
.call
metode, bukan.apply
. Lihat pertanyaan StackOverflow ini .Metode lain memang bagus tetapi tidak mempertahankan fungsi prototipe apa pun yang dilampirkan ke init. Untuk menyiasatinya, Anda dapat melakukan hal berikut (terinspirasi oleh kiriman dari Nick Craver).
sumber
Pilihan lain bisa jadi:
sumber
Ini sangat sederhana dan lurus ke depan. Lihat kodenya. Cobalah untuk memahami konsep dasar di balik ekstensi javascript.
Pertama mari kita memperluas fungsi javascript.
Anda dapat memperluas fungsi ini dengan membuat fungsi anak dengan cara berikut
Sekarang Anda dapat menggunakan fungsi Anak sebagai berikut,
Kita juga dapat membuat Fungsi Javascript dengan memperluas kelas Javascript, seperti ini.
Mari kita memperluas kelas ini dengan fungsi Anak seperti ini,
Sekali lagi Anda dapat menggunakan fungsi Anak sebagai berikut untuk mendapatkan hasil yang serupa,
Javascript adalah bahasa yang sangat mudah. Kami bisa melakukan hampir semua hal. Selamat JavaScripting ... Semoga saya bisa memberi Anda ide untuk digunakan dalam kasus Anda.
sumber
Gunakan extensionFunction.js
Namun dalam kasus spesifik Anda, lebih mudah untuk memperluas fungsi onload global:
Saya sebenarnya sangat menyukai pertanyaan Anda, ini membuat saya berpikir tentang kasus penggunaan yang berbeda.
Untuk acara javascript, Anda benar-benar ingin menambah dan menghapus penangan - tetapi untuk ekstensiFungsi, bagaimana Anda nantinya dapat menghapus fungsionalitas? Saya dapat dengan mudah menambahkan metode .revert ke fungsi yang diperluas, jadi
init = init.revert()
akan mengembalikan fungsi aslinya. Jelas ini dapat menyebabkan beberapa kode yang sangat buruk, tetapi mungkin ini memungkinkan Anda menyelesaikan sesuatu tanpa menyentuh bagian asing dari basis kode.sumber