一、基本概念
在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只有構造器函數纔有。
二、應用場景
- 例一:
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指向嘚瑟對象,可以重新指定。
- 例二:
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