原型,原型鏈與原型繼承
基本概念和原型鏈
- Prototype(原型對象)
每個函數(shù)都有, 指向其原型對象
- _proto_
這是除了null都有的屬性, 指向其原型
- constructor
每個原型都有, 指向構(gòu)造函數(shù)(函數(shù))

原型鏈
實例和原型
function Person() {}
Person.prototype.name = 'Kevin';
var person = new Person();
person.name = 'Daisy';
console.log(person.name) // Daisy 實例覆蓋原型
delete person.name;
console.log(person.name) // Kevin
在這個例子中,我們給實例對象 person 添加了 name 屬性,當(dāng)我們打印 person.name 的時候,結(jié)果自然為 Daisy。但是當(dāng)我們刪除了 person 的 name 屬性時,讀取 person.name,從 person 對象中找不到 name 屬性就會從 person 的原型也就是 person._proto_ ,也就是 Person.prototype中查找,幸運的是我們找到了 name 屬性,結(jié)果為 Kevin。
如果原型上依然沒找到,就會繼續(xù)到原型的原型上去找直到null為止
原型繼承
如果讓原型對象等于另一個類型的實例,此時的原型對象將包含一個指向另一個原型的指針(proto),另一個原型也包含著一個指向另一個構(gòu)造函數(shù)的指針(constructor)。
function Animal(){
this.type = "animal";
}
Animal.prototype.getType = function(){
return this.type;
}
function Dog(){
this.name = "dog";
}
Dog.prototype = new Animal(); //此步驟為繼承 父 中的屬性
Dog.prototype.getName = function(){
return this.name;
} s
var xiaohuang = new Dog();
//原型鏈關(guān)系
xiaohuang.__proto__ === Dog.prototype
Dog.prototype.__proto__ === Animal.prototype
Animal.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null