Saya telah menghabiskan sedikit waktu mengembangkan widget sederhana untuk proyek dengan cara berikut:
var project = project || {};
(function() {
project.elements = {
prop1: val1,
prop2: val2
}
project.method1 = function(val) {
// Do this
}
project.method2 = function(val) {
// Do that
}
project.init = function() {
project.method1(project.elements.prop1)
project.method2(project.elements.prop2)
}
})()
project.init();
Tapi saya sudah mulai mengubah format saya sebagai berikut:
function Project() {
this.elements = {
prop1: val1,
prop2: val2
}
this.method_one(this.elements.prop1);
this.method_two(this.elements.prop2);
}
Project.prototype.method_one = function (val) {
//
};
Project.prototype.method_two = function (val) {
//
};
new Project();
Memang, ini adalah contoh konyol jadi jangan sampai terlilit di axel. Tetapi apa perbedaan fungsional dan kapan saya harus memilih yang satu atau yang lain?
design-patterns
javascript
prototyping
JDillon522
sumber
sumber
project
deklarasi di dalam fungsi. Diperbarui.Jawaban:
Perbedaan pertama dapat diringkas sebagai:
this
merujuk pada Instance dari kelas.prototype
mengacu pada Definisi .Katakanlah kita memiliki kelas berikut:
Jadi di sini kita melekat
this.number
pada setiap instance kelas, dan itu masuk akal karena setiap orangFlight
harus memiliki nomor penerbangan mereka sendiri.Sebaliknya,
prototype
mendefinisikan satu properti yang dapat diakses oleh semua instance.Sekarang jika kita ingin mendapatkan nomor penerbangan, kita cukup menulis cuplikan berikut ini dan semua instance kita akan mendapatkan Referensi ke objek yang baru di-prototipe ini.
Perbedaan kedua adalah tentang cara JavaScript mencari properti suatu objek. Saat Anda mencari
Object.whatever
, JavaScript bergerak sampai ke objek Obyek utama (objek yang diwarisi dari yang lainnya), dan segera setelah menemukan kecocokan, ia akan kembali atau memanggilnya.Tapi itu hanya terjadi untuk properti prototipe. Jadi, jika Anda memiliki suatu tempat di tingkat yang lebih tinggi
this.whatever
, JavaScript tidak akan menganggapnya sebagai pertandingan dan akan melanjutkan pencarian.Mari kita lihat bagaimana itu terjadi dalam kenyataan.
Catatan pertama bahwa [hampir] semuanya adalah Objek dalam JavaScript. Coba ini:
Sekarang mari kita lihat apa yang ada di dalam
Object
(perhatikan Huruf BesarO
dan.
pada akhirnya). Di Alat Pengembang Google Chrome saat Anda memasukkan,.
Anda akan mendapatkan daftar properti yang tersedia di dalam objek tertentu.Sekarang lakukan hal yang sama untuk
Function
:Anda mungkin memperhatikan
name
metodenya. Pergi saja dan nyalakan dan mari kita lihat apa yang terjadi:Sekarang mari kita buat fungsi:
Dan mari kita lihat apakah kita punya
name
metode di sini juga:Anda harus mendapatkan string kosong, tapi tidak apa-apa. Anda seharusnya tidak mendapatkan Kesalahan atau Pengecualian.
Sekarang mari kita tambahkan sesuatu seperti dewa itu
Object
dan lihat apakah kita mendapatkannya di tempat lain juga?Dan itu dia:
Dalam semua kasus, Anda harus melihat
"Okay!"
.Mengenai pro dan kontra dari masing-masing metode Anda dapat mempertimbangkan prototyping sebagai cara "lebih efisien" dalam melakukan sesuatu, karena itu membuat referensi pada setiap contoh daripada menyalin seluruh properti di setiap objek. Di sisi lain itu adalah contoh Tightly Coupling yang merupakan no-no besar sampai Anda benar-benar dapat membenarkan alasannya.
this
cukup rumit karena relevan dengan konteks. Anda dapat menemukan banyak sumber daya yang baik secara gratis di internet.Itu semua mengatakan, kedua cara hanyalah alat bahasa dan itu benar-benar tergantung pada Anda dan masalah yang Anda coba pecahkan untuk memilih yang lebih cocok.
Jika Anda perlu memiliki properti agar relevan dengan setiap instance kelas, maka gunakan
this
. Jika Anda perlu memiliki properti agar berfungsi sama di setiap instance, kemudian gunakanprototype
.Memperbarui
Mengenai cuplikan sampel Anda, yang pertama adalah contoh Singleton , jadi masuk akal untuk digunakan
this
dalam tubuh objek. Anda juga dapat meningkatkan contoh Anda dengan menjadikannya modular seperti ini (dan Anda tidak perlu selalu menggunakannyathis
juga).Cuplikan kedua Anda tidak masuk akal karena pertama kali Anda gunakan
this
dan kemudian Anda mencoba meretasnyaprototype
, yang tidak berfungsi karenathis
diprioritaskanprototype
. Saya tidak yakin apa yang Anda harapkan dari potongan kode itu dan bagaimana cara kerjanya, tetapi saya sangat menyarankan Anda untuk memperbaikinya.Memperbarui
Untuk menguraikan tentang
this
diutamakanprototype
saya dapat menunjukkan kepada Anda sebuah contoh dan memberi tahu Anda bagaimana hal itu dapat dijelaskan, tetapi saya tidak memiliki sumber daya eksternal untuk mendukungnya.Contohnya sangat sederhana:
Penjelasannya, seperti yang kita ketahui,
this
relevan dengan konteksnya. Jadi itu tidak akan ada sampai konteksnya siap. Kapan konteks siap? Saat instance baru sedang dibuat! Anda harus menebak sisanya sekarang! Ini berarti bahwa meskipun adaprototype
definisi, tetapithis
lebih masuk akal untuk diutamakan karena ini semua tentang contoh baru yang dibuat pada saat itu.sumber
this
contoh prototipe konyol karenathis
mengacu pada propertinya sendiri, termasuk metodenya. Saya tidak belajar yang terbaik dari membaca tentang kode, tetapi lebih dari melihat kode. ( MDN sedikit di atasnya , Object Playground (luar biasa) , dan beberapa lainnya). Bisakah Anda menunjukkan sesuatu yang menjelaskan apa yang Anda maksud tentang "this
mengambil prioritasprototype
"? Saya ingin melihatnya lebih dalam.