Di Javascript ada beberapa teknik yang jelas menonjol untuk membuat dan mengelola kelas / ruang nama dalam javascript.
Saya ingin tahu situasi apa yang perlu menggunakan satu teknik vs yang lain. Saya ingin memilih satu dan tetap menggunakannya.
Saya menulis kode perusahaan yang dikelola dan dibagikan di banyak tim, dan saya ingin tahu apa praktik terbaik saat menulis javascript yang bisa dikelola?
Saya cenderung memilih Fungsi Anonim yang Dapat Dilakukan Sendiri, tetapi saya ingin tahu apa suara masyarakat mengenai teknik-teknik ini.
Prototipe:
function obj()
{
}
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Fungsi Anonim Menutup Sendiri:
//Self-Executing Anonymous Function
(function( skillet, $, undefined ) {
//Private Property
var isHot = true;
//Public Property
skillet.ingredient = "Bacon Strips";
//Public Method
skillet.fry = function() {
var oliveOil;
addItem( "\t\n Butter \n\t" );
addItem( oliveOil );
console.log( "Frying " + skillet.ingredient );
};
//Private Method
function addItem( item ) {
if ( item !== undefined ) {
console.log( "Adding " + $.trim(item) );
}
}
}( window.skillet = window.skillet || {}, jQuery ));
//Public Properties
console.log( skillet.ingredient ); //Bacon Strips
//Public Methods
skillet.fry(); //Adding Butter & Fraying Bacon Strips
//Adding a Public Property
skillet.quantity = "12"; console.log( skillet.quantity ); //12
//Adding New Functionality to the Skillet
(function( skillet, $, undefined ) {
//Private Property
var amountOfGrease = "1 Cup";
//Public Method
skillet.toString = function() {
console.log( skillet.quantity + " " +
skillet.ingredient + " & " +
amountOfGrease + " of Grease" );
console.log( isHot ? "Hot" : "Cold" );
};
}( window.skillet = window.skillet || {}, jQuery ));
//end of skillet definition
try {
//12 Bacon Strips & 1 Cup of Grease
skillet.toString(); //Throws Exception
} catch( e ) {
console.log( e.message ); //isHot is not defined
}
Saya merasa bahwa saya harus menyebutkan bahwa Fungsi Anonim Mengeksekusi Sendiri adalah pola yang digunakan oleh tim jQuery.
Pembaruan
Ketika saya mengajukan pertanyaan ini, saya tidak benar-benar melihat pentingnya apa yang saya coba pahami. Masalah sebenarnya yang dihadapi adalah apakah menggunakan baru atau tidak untuk membuat instance objek Anda atau menggunakan pola yang tidak memerlukan konstruktor / penggunaan new
kata kunci.
Saya menambahkan jawaban saya sendiri, karena menurut saya kita harus menggunakan pola yang tidak menggunakan new
kata kunci.
Untuk informasi lebih lanjut silakan lihat jawaban saya.
sumber
Jawaban:
Fungsi anonim yang dijalankan sendiri digunakan untuk mengotomatiskan eksekusi skrip tanpa menghubungkan ke peristiwa eksternal (yaitu window.onload).
Dalam contoh ini digunakan untuk membentuk pola Modul klasik, tujuan utamanya adalah untuk memperkenalkan namespace ke lingkungan global, dan menyediakan enkapsulasi untuk properti internal yang tidak "diekspor" atau dilampirkan ke namespace.
Memodifikasi prototipe objek, di sisi lain, digunakan untuk membangun warisan (atau memperpanjang asli). Pola ini digunakan untuk menghasilkan 1: n objek dengan metode atau properti umum.
Anda tidak boleh memilih satu pola dalam preferensi terhadap yang lain, karena mereka melakukan tugas yang berbeda . Dalam hal penempatan nama, Self Executing Function adalah pilihan yang tepat.
sumber
Inilah pola yang baru saja saya mulai gunakan (telah menggunakan variasi hingga kemarin):
Beberapa pemikiran tentang ini:
(anonymous)
jejak di jejak tumpukan debugger Anda karena semuanya bernama (tidak ada fungsi anonim).Satu-satunya waktu yang saya gunakan
prototype
lagi adalah mendefinisikan warisan.sumber
function clone(obj){return this typeof 'clone' ? this : new clone(clone.prototype=obj)}
prototype
metode seperti yang Anda sarankan adalah (kecuali ada metode yang saya tidak terbiasa, yang mungkin terjadi) bahwa Anda kehilangan kemampuan untuk merangkum atribut, yang berarti semuanya terbuka sebagai publik (yang bukan akhir dari dunia , hanya preferensi pribadi).Saya menggunakan prototipe karena lebih bersih dan mengikuti pola pewarisan standar. Fungsi self-invaging sangat bagus untuk pengembangan browser atau situasi di mana Anda tidak tahu di mana kode dieksekusi, tetapi selain itu hanya noise.
Contoh:
sumber
Saya akan menggunakan fungsi self-executing, tetapi dengan sedikit perbedaan:
Jika menemukan pendekatan ini jauh lebih bersih, karena saya memisahkan variabel global yang dikembalikan dari setiap parameter input (seperti jQuery) (cara Anda menulisnya sama dengan mengembalikan batal dan menggunakan parameter ref di C #, yang saya temukan sedikit mati, atau meneruskan pointer ke pointer dan menugaskannya kembali di C ++). Jika saya kemudian akan melampirkan metode atau properti tambahan ke kelas saya akan menggunakan pewarisan prototypal (contoh dengan metode $ .extend jQuery, tapi cukup mudah untuk menggulung perpanjangan Anda sendiri ()):
Dengan cara ini Anda memiliki perbedaan yang jelas antara metode yang ditambahkan dan yang asli.
sumber
Contoh Langsung
Anda dapat menggunakan IIFE untuk meniru "lingkup modul" di sekitar kode Anda. Maka Anda bisa menggunakan objek seperti biasa.
Jangan "meniru" negara swasta menggunakan penutupan karena memiliki hukuman memori yang besar.
Jika Anda menulis aplikasi perusahaan dan ingin menjaga penggunaan memori Anda di bawah 1GB, hindari penggunaan penutupan yang tidak perlu untuk menyimpan status.
sumber
console
dan globalconsole
adalah optimasi mikro. Layak untuk dilakukan sehingga Anda dapat meminimalkanconsole
tetapi itu masalah yang berbedaPembaruan Sekarang saya memiliki pemahaman yang jauh lebih baik tentang javascript dan merasa saya dapat menjawab pertanyaan dengan benar. Saya pikir itu adalah topik javascript yang buruk, tetapi sangat penting untuk diatasi.
Pola Self Executing Anonymous Function bukan pola yang mengharuskan penggunaan kata kunci baru jika Anda menghindari penggunaan di luar fungsi ini. Saya setuju dengan gagasan bahwa menggunakan yang baru adalah teknik lama dan kita harus berusaha menggunakan pola yang menghindari penggunaan yang baru.
Fungsi Self Executing Anonymous memenuhi kriteria ini.
Jawaban atas pertanyaan ini adalah subyektif, karena ada begitu banyak gaya pengkodean dalam javascript. Namun berdasarkan penelitian dan pengalaman saya, saya akan merekomendasikan memilih untuk menggunakan Fungsi Anonim Mengeksekusi Sendiri untuk menentukan API Anda dan menghindari penggunaan baru bila memungkinkan.
sumber
Inilah bagaimana saya akan melakukan ini
IIFE
SelfExecutingFunction
untuk memperpanjangMyclass
denganMyclass.anotherFunction()
;sumber