Apa gunanya metode prototipe?


10

Saya membaca Javascript: Bagian Yang Baik , dan berjuang untuk mendapatkan bagian saya tentang prototipe .

Setelah sedikit google, saya sampai pada kesimpulan bahwa itu adalah untuk menambahkan properti ke objek setelah deklarasi objek.

Menggunakan skrip ini yang dikilau dari w3schools, saya perhatikan bahwa menghapus baris yang menambahkan properti prototipe tidak berpengaruh . Jadi apa gunanya?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);


4
@Raynos mengatakan dengan baik, tetapi menyarankan penggantian juga, misalnya dokumen MDN: developer.mozilla.org/en/JavaScript
StuperUser

Jawaban:


13

Itu bukan cara kerja prototipe. Prototipe digunakan dalam rantai prototipe.

Setiap kali Anda mencoba untuk mendapatkan properti pada objek itu akan memeriksa objek untuk nama properti itu. Jika tidak ada maka akan terlihat di prototipe.

Contoh:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Jadi inti dari prototipe hanyalah penggunaan kembali kode dan pewarisan.


Oke, jadi saya mengerti sekarang. Tapi saya mencoba untuk menambahkan properti dinamis, dan mengatakan kepada saya prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz

3
@MildFuzz oadalah sebuah objek. The .prototypeproperti digunakan pada fungsi, mengabaikannya. Lakukan sajao.newProp = "mutts nuts"
Raynos

7

Ketika Anda melakukannya, fred.salary=20000Anda telah menambahkan atribut gaji hanya ke fred. Saat menggunakan prototipe, semua karyawan yang Anda buat sejak saat itu akan memiliki atribut gaji.

Katakanlah Anda memiliki 100 contoh karyawan, dan Anda ingin menambahkan atribut gaji ke mereka semua. Anda bisa melakukannya secara manual, beralih ke setiap karyawan dan menambahkannya. Atau Anda bisa menggunakan prototipe dan mengatur jika untuk semuanya.

Prototipe berguna ketika Anda ingin fungsionalitas untuk sesuatu yang sudah ada. Katakanlah Anda ingin menambahkan metode khusus ke array. Anda akan melakukan sesuatu seperti:

Array.prototype.my_custom_method = function() {...}

Dari sana, semua array yang akan Anda buat, akan memiliki metode yang tersedia.


3
Saya terkejut bahwa tidak ada yang menyebutkan bahwa ini dirancang untuk menjaga penggunaan memori tetap rendah. Jika Anda perlu mengimplementasikan objek kompleks yang memiliki banyak kode, Anda tidak ingin kode tersebut diulang di setiap instance objek. Jelas, properti data lebih cenderung berbeda di setiap contoh, tetapi Anda biasanya hanya ingin satu salinan kode, jadi Anda memasukkannya ke dalam prototipe.
Dominic Cronin

1
IMO ini adalah jawaban terbaik sejauh ini.
The Muffin Man

5

Anda mungkin ingin melihat artikel ini .

Bahasa berbasis prototipe memiliki gagasan tentang objek prototipe, objek yang digunakan sebagai templat untuk mendapatkan properti awal untuk objek baru. Objek apa pun dapat menentukan propertinya sendiri, baik saat Anda membuatnya atau saat dijalankan. Selain itu, objek apa pun dapat dikaitkan sebagai prototipe untuk objek lain, memungkinkan objek kedua berbagi properti objek pertama.

Jika Anda menambahkan properti ke objek yang digunakan sebagai prototipe untuk sekumpulan objek, objek yang menjadi prototipe juga mendapatkan properti baru.

Itulah salah satu keunggulan utama bahasa berbasis prototipe dibandingkan bahasa berbasis kelas.

Juga, mudah untuk mendapatkan warisan OO klasik dengan JS jika Anda perlu, tetapi seringkali sulit untuk mendapatkan prototipe-model untuk bahasa yang tidak mengimplementasikannya secara default.


3
+1 untuk artikel bahasa berbasis prototipe vs. berbasis kelas
adivasile
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.