深刻淺出,JS原型鏈的工做原理

前言:原型鏈,即原型鏈條。它是由原型、原型的原型、原型的原型的原型...這一規則組合成的,常常被應用於繼承。瀏覽器


原型的做用
在JS中,每一個對象都有本身的原型。當咱們訪問對象的屬性和方法時,JS會先訪問對象自己的屬性和方法。若是對象自己不包含這些屬性和方法,則訪問對象對應的原型。函數

function Person(name,age){
    // 對象自身的屬性
    this.name = name;
    this.age = age;
    
    // 對象自身的方法
    this.sayName = function(){
        alert(this.name);
    };
}

//原型上的方法
Person.prototype.sayAge = function(){
    alert(this.age)
}

var xiaoming = new Person("XiaoMing",12);
var xiaoHong = new Person("XiaoHong",11);

// 調用自身不存在的方法
xiaoming.sayAge(); // 12
xiaoHong.sayAge(); // 11

上述例子中,方法「sayAge」是在原型上而非對象中。(關於對象與原型之間更爲詳細的內容,可閱讀文章:《淺談JS中的構造函數、原型對象(prototype)、實例中的屬性/方法之間的關係》this


原型鏈的原理
原型自身也是一個對象(默認狀況下全部對象都是Object的實例)。spa

alert(xiaoming instanceof Object); // true
alert(Person.prototype instanceof Object); // true

每一個對象都有本身的原型,因此Person的原型也有它本身的原型,那就是:Object.prototype(部分瀏覽器容許經過實例的「__proto__」屬性訪問其原型)prototype

alert(Person.prototype.__proto__ == Object.prototype); // true

既然原型是一個對象,那麼,當咱們訪問的屬性和方法在原型不存在,就會繼續訪問原型的原型,直至Object.prototype。code

function Person(name,age){
    this.name = name;
    this.age = age;
    this.sayName = function(){
        alert(this.name);
    };
}
Person.prototype.sayAge = function(){
    alert(this.age)
}

// 在Object.prototype增長一個「自我介紹」的方法
Object.prototype.introduce = function(){**
    alert("My name is " + this.name + ",I'm " + this.age + " years old!")
}

var xiaoming = new Person("XiaoMing",12);
// 調用對象自身和原型上均不存在的方法
xiaoming.introduce(); // My name is XiaoMing,I'm 12 years old!

原型鏈關係

總結
原型鏈是JS的一個特性,它實現的核心機制是:
一、訪問對象的屬性(方法)時,若對象自己不存在該屬性(方法),則會轉向訪問該對象的原型;
二、對象的原型也是一個對象。訪問的屬性(方法)依舊不存在於該原型,則會繼續訪問該原型的原型...對象

相關文章
相關標籤/搜索