Rumah  >  Artikel  >  hujung hadapan web  >  Perbezaan antara __proto__ dan prototaip dalam JS

Perbezaan antara __proto__ dan prototaip dalam JS

PHPz
PHPzasal
2024-02-19 13:38:06534semak imbas

Perbezaan antara __proto__ dan prototaip dalam JS

Dalam JS, __proto__ dan prototaip ialah dua atribut yang berkaitan dengan prototaip, dan ia mempunyai fungsi yang sedikit berbeza. Artikel ini akan memperkenalkan dan membandingkan perbezaan antara kedua-duanya secara terperinci, dan memberikan contoh kod yang sepadan.

Pertama, mari kita fahami maksud dan kegunaannya.

proto

__proto__ ialah sifat terbina dalam objek, yang digunakan untuk menunjuk kepada prototaip objek. Setiap objek mempunyai atribut __proto__, termasuk objek tersuai, objek terbina dalam dan objek fungsi. Melalui atribut __proto__, kita boleh mengakses dan memanipulasi rantai prototaip objek.

Mari kita lihat contoh:

let obj = {};
console.log(obj.__proto__); // 输出:Object {}

let arr = [];
console.log(arr.__proto__); // 输出:Array []

function func() {}
console.log(func.__proto__); // 输出:[Function]

Dalam kod di atas, kami mencipta obj objek kosong dan mengakses atribut __proto__nya. Seperti yang anda boleh lihat, obj.__proto__ menghala ke objek{} Objek. Begitu juga, kami juga mencipta arr tatasusunan kosong dan mengakses atribut __proto__ Hasilnya ialah arr.__proto__ menghala ke objek Array[]. Untuk fungsi objek fungsi, __proto__nya menghala ke objek [Fungsi].

Untuk meringkaskan, atribut __proto__ digunakan untuk menunjuk kepada prototaip objek, yang melaluinya kita boleh mengakses dan mengendalikan rantai prototaip.

prototaip

prototaip ialah atribut unik objek fungsi, yang menunjuk kepada objek prototaip. Setiap objek fungsi mempunyai atribut prototaip, tetapi ia hanya bermakna jika fungsi itu digunakan sebagai pembina.

Mari kita lihat contoh:

function Person() {}

console.log(Person.prototype); // 输出:Person {}

Dalam kod di atas, kami mentakrifkan objek fungsi Person dan mengakses atribut prototaipnya. Seperti yang anda boleh lihat, Person.prototype menghala ke objek{} Person.

Fungsi utama atribut prototaip adalah untuk membina rantaian prototaip objek contoh dalam mod pembina. Apabila kita menggunakan pembina untuk mencipta objek, atribut __proto__nya menunjuk kepada atribut prototaip pembina.

let person = new Person();

console.log(person.__proto__ === Person.prototype); // 输出:true

Dalam kod di atas, kami menggunakan pembina Orang untuk mencipta orang objek. Ternyata orang itu.__proto__ menunjuk ke Person.prototype.

Perbezaan dan sambungan

__proto__ dan prototaip kedua-duanya berkaitan dengan prototaip objek. Sambungan dan perbezaan antara mereka adalah seperti berikut:

  1. __proto__ ialah atribut objek contoh, digunakan untuk menunjuk kepada prototaip. objek; manakala prototaip ialah pembina Atribut fungsi yang digunakan untuk menunjuk kepada objek prototaip pembina.
  2. __proto__ ialah sifat yang membaca dan mengakses rantai prototaip objek dan boleh diakses terus pada objek contoh ialah sifat pembina dan hanya boleh diakses di dalam pembina.
  3. __proto__ boleh diubah suai melalui Object.setPrototypeOf() atau penetapan langsung manakala prototaip hanya boleh diubah suai di dalam pembina melalui nama fungsi.prototype.
  4. __proto__ ialah atribut bukan standard, hanya disokong oleh beberapa pelayar; prototaip ialah atribut standard, dan semua objek serta fungsi memilikinya.

Contoh kod berikut digunakan untuk menggambarkan lagi perbezaan dan perkaitan antara keduanya:

function Animal() {}
Animal.prototype.eat = function() {
  console.log("Animal is eating");
};

function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
  console.log("Dog is barking");
};

const dog1 = new Dog();
dog1.eat(); // 输出:Animal is eating
dog1.bark(); // 输出:Dog is barking

console.log(dog1.__proto__ === Dog.prototype); // 输出:true
console.log(Dog.prototype.__proto__ === Animal.prototype); // 输出:true

Dalam kod di atas, kami mencipta hubungan warisan dengan mentakrifkan pembina Haiwan dan pembina Anjing. Melalui atribut __proto__ dan prototaip, kita boleh mengakses rantaian prototaip objek dan membuktikan hubungan antara mereka.

Ringkasnya, __proto__ dan prototaip kedua-duanya berkaitan dengan prototaip dalam JS, tetapi ia berbeza dari segi fungsi dan penggunaan. Memahami perbezaan mereka boleh membantu kami memahami dengan lebih baik mekanisme prototaip dalam JS dan menggunakannya dengan lebih fleksibel semasa menulis kod.

Atas ialah kandungan terperinci Perbezaan antara __proto__ dan prototaip dalam JS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn