JavaScript基本知識——初識__proto__、prototype、原型鏈

JavaScript基本知識——初識__proto__、prototype、原型鏈

一、基本概念

在JavaScript中變量類型分爲兩大類基本類型和引用類型,而基本類型中除Undefined、Null外都有相對應的對象類型,因爲這兩個在javascript中表示“無”,可參考阮一峯的日誌。所有的對象類型都是Object的實例,Object.prototype屬性和方法可以通過new實例化訪問,故所有對象都具有Object實例的屬性和方法,這就是原型鏈prototype實現的。
在這裏插入圖片描述
__proto__也稱隱式原型鏈,該屬性指向該對象的構造器函數的prototype對象,保證了對象在實例化時調用構造器函數,在其中可以訪問prototype屬性,所有定義的變量都有 __proto__屬性,例如:
在這裏插入圖片描述 在這裏插入圖片描述
prototype原型鏈是一個對象,對象類型具有這個屬性,該屬性實質是指向一個對象地址,同時該實例化的對象共享了prototype原型鏈對象的屬性和方法。原型對象也有一個constructor構造器屬性,這個屬性也是一個對象並指向原始構造函數。
在這裏插入圖片描述
在這裏插入圖片描述
原型鏈指向,Array—>Object—>null;Function—>Object—>null。對象屬性的查找是一層層往頂級查找。
__proto__和prototype區別:所有變量都有__proto__屬性,prototype只有構造器函數纔有。

二、應用場景

  1. 例一:
function Animal(name){
   this.name = name;
}

Animal.prototype.name= function() {  
   console.log("this is a "+this.name);
}
var dog = new Animal("dog");
Animal.prototype={
   go:function(){
   	console.log(this.name+" is going");
   },
   name:function() {  
   	console.log("this is a "+this.name);
   }
}
var cat= new Animal("cat");
dog.name();         //this is a dog
dog.go();                  //dog.go is not a function
cat.name();         //this is a cat
cat.go();                   //cat is going

解釋:prototype指向嘚瑟對象,可以重新指定。

  1. 例二:
var Fun=function(){};
Object.prototype.a=function(){
   console.log('a()')
};
Function.prototype.b=function(){
   console.log('b()')
}
Fun.prototype.c=function(){
   console.log('c()')
}
var fun=new Fun();
fun.a();   //a()
fun.b();   //fun.b is not a function
fun.c();   //c()
Fun.a();   //a()
Fun.b();   //b()
Fun.c();   //Fun.c is not a function

解釋:fun的原型是Fun的對象類型,Fun的原型是函數類型,屬於構造器函數類型。

3.例三:

var arr=[1,2,3];
console.log(arr instandof Array);    //true
console.log(Array instandof Object); //true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章