原型,原型鏈與原型繼承
基本概念和原型鏈
- Prototype(原型對象)
每個函數(shù)都有放接, 指向其原型對象
- _proto_
這是除了null都有的屬性, 指向其原型
- constructor
每個原型都有留特, 指向構造函數(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 屬性玛瘸,當我們打印 person.name 的時候,結果自然為 Daisy苟蹈。但是當我們刪除了 person 的 name 屬性時糊渊,讀取 person.name,從 person 對象中找不到 name 屬性就會從 person 的原型也就是 person._proto_ 慧脱,也就是 Person.prototype中查找再来,幸運的是我們找到了 name 屬性,結果為 Kevin磷瘤。
如果原型上依然沒找到,就會繼續(xù)到原型的原型上去找直到null為止
原型繼承
如果讓原型對象等于另一個類型的實例,此時的原型對象將包含一個指向另一個原型的指針(proto)搜变,另一個原型也包含著一個指向另一個構造函數(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();
//原型鏈關系
xiaohuang.__proto__ === Dog.prototype
Dog.prototype.__proto__ === Animal.prototype
Animal.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null