Rumah  >  Artikel  >  hujung hadapan web  >  Apakah sebenarnya Prototaip dalam petua Javascript_javascript

Apakah sebenarnya Prototaip dalam petua Javascript_javascript

WBOY
WBOYasal
2016-05-16 15:15:111701semak imbas

Javascript juga merupakan bahasa berorientasikan objek, tetapi ia adalah bahasa berasaskan prototaip dan bukannya bahasa berasaskan kelas. Dalam Javascript, nampaknya tidak banyak perbezaan antara kelas dan objek.

Apakah itu prototaip:

Objek yang ditakrifkan mengikut fungsi mempunyai atribut prototaip, dan atribut prototaip menghala ke objek prototaip Ambil perhatian bahawa atribut prototaip dan objek prototaip adalah dua perkara yang berbeza, jadi perhatikan perbezaannya. Terdapat satu lagi atribut pembina dalam objek prototaip Atribut pembina ini juga menunjuk kepada objek pembina, dan objek pembina ini adalah fungsi itu sendiri. Tidakkah ia sangat berbelit-belit? Dinyatakan dalam kod pseudo seperti berikut:

var function{
prototype:prototype{
constructor:constructor == function
}
}

Belum faham lagi? Tengok gambar:


Peranan prototaip:

Apa sebenarnya yang dilakukan oleh prototaip ini? Lihat contoh di bawah:

function jb51(){
}
jb51.prototype.name = "a";
var test = new jb51();
alert(test.name)//"a";

Sungguh pelik, jelas sekali atribut nama tidak ditetapkan untuk ujian, tetapi mengapa ada nilai?

Ini ialah sumbangan prototaip Nama objek dalam atribut prototaip dalam uw3c diwarisi ke dalam atribut ujian objek selepas uw3c dicipta oleh pembina baharu. Baca seterusnya:

var name = "js";
function jb51(name){
alert(this.name);//"css"
}
jb51.prototype.name = "css";
var test = new jb51();
test()

Mengapakah nilai amaran bukan "js"? Prosesnya lebih kurang seperti berikut:

var test={};
uw3c.call(test);

Langkah pertama ialah mencipta objek baharu (ujian).

Langkah kedua ialah menetapkan objek prototaip terbina dalam objek (ujian) kepada objek prototaip yang dirujuk oleh atribut prototaip pembina (iaitu, uw3c).

Langkah ketiga ialah memanggil pembina (iaitu uw3c) menggunakan objek (ujian) sebagai parameter ini untuk menyelesaikan kerja permulaan seperti tetapan ahli.

Istilah baharu muncul dalam langkah kedua, iaitu objek prototaip terbina dalam Ambil perhatian bahawa istilah baharu ini bukan perkara yang sama dengan objek prototaip. Untuk membezakannya, saya memanggilnya inobj dan inobj menunjuk ke objek prototaip fungsi uw3c. Sebarang sifat atau fungsi yang muncul dalam objek prototaip uw3c boleh digunakan secara langsung dalam objek ujian Ini adalah warisan prototaip dalam JS.

Biasanya, buat objek seperti ini:

function person(name){
this.sayHi = function(){
alert('hi ' + this.name);
}
this.name = name;
}
var p = new person("dan");
p.sayHi(); 

Di atas, gunakan kata kunci baharu untuk mencipta tika objek melalui objek (fungsi juga objek khas).

Dalam bahasa berasaskan kelas, atribut atau medan biasanya ditakrifkan terlebih dahulu dalam kelas, tetapi dalam Javascript, medan boleh ditambahkan pada kelas selepas objek dibuat.

function animal(){}
var cat = new animal();
cat.color = "green"; 

Di atas, medan warna hanya milik contoh kucing semasa.
Untuk medan yang ditambahkan kemudian, bagaimana jika anda mahu semua contoh haiwan memilikinya?

--使用Prototype
function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green 

Bukan sahaja medan boleh ditambah melalui Prototaip, tetapi kaedah juga boleh ditambah.

function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green
animal.prototype.run = funciton(){
console.log("run");
}
dog.run(); 

Ternyata melalui atribut prototaip, anda juga boleh menukar tingkah laku objek selepas menciptanya.
Sebagai contoh, anda boleh menambah kaedah pada objek khas yang dipanggil tatasusunan.

Array.prototype.remove = function(elem){
var index = this.indexof(elem);
if(index >= 0){
this.splice(index, 1);
}
}
var arr = [1, 2, 3] ;
arr.remove(2); 

Selain menentukan sifat atau kaedah untuk objek melalui prototaip, anda juga boleh menentukan sifat atau kaedah kelas melalui pembina objek.

function animal(){
this.color = "green";
this.run = function(){
console.log("run");
}
}
var mouse = new animal();
mouse.run(); 

Pendekatan di atas juga boleh membenarkan semua contoh haiwan berkongsi semua bidang dan kaedah. Dan kelebihan lain ialah anda boleh menggunakan pembolehubah tempatan kelas dalam pembina.

function animal(){
var runAlready = false;
this.color = "green";
this.run = funciton(){
if(!runAlreadh){
console.log("start running");
} else {
console.log("already running")
}
}
} 

Malah, pendekatan yang lebih praktikal ialah mentakrifkan medan dan gelagat kelas melalui pembina yang digabungkan dengan prototaip.

function animal(){
var runAlready = false;
this.run = function(){
if(!runAlready){
console.log('i am running');
} else {
console.log("i am already running");
}
}
}
animal.prototype.color = '';
animal.prototype.hide = funciton(){
console.log("");
}
var horse = new animal();
horse.run();
horse.hide(); 

Prototaip membolehkan kami menukar gelagat objek atau kelas selepas mencipta objek, dan medan atau kaedah ini ditambah melalui atribut prototaip dikongsi oleh semua tika objek.

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