摘要:前言原型鏈,即原型鏈條。原型的作用在中,每個對象都有自己的原型。訪問的屬性方法依舊不存在于該原型,則會繼續訪問該原型的原型
前言:原型鏈,即原型鏈條。它是由原型、原型的原型、原型的原型的原型...這一規則組合成的,經常被應用于繼承。
原型的作用
在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)、實例中的屬性/方法之間的關系》)
原型鏈的原理
原型自身也是一個對象(默認情況下所有對象都是Object的實例)。
alert(xiaoming instanceof Object); // true alert(Person.prototype instanceof Object); // true
每個對象都有自己的原型,所以Person的原型也有它自己的原型,那就是:Object.prototype(部分瀏覽器允許通過實例的“__proto__”屬性訪問其原型)
alert(Person.prototype.__proto__ == Object.prototype); // true
既然原型是一個對象,那么,當我們訪問的屬性和方法在原型不存在,就會繼續訪問原型的原型,直至Object.prototype。
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的一個特性,它實現的核心機制是:
1、訪問對象的屬性(方法)時,若對象本身不存在該屬性(方法),則會轉向訪問該對象的原型;
2、對象的原型也是一個對象。訪問的屬性(方法)依舊不存在于該原型,則會繼續訪問該原型的原型...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99711.html
摘要:兩日前,發了一篇吐槽,莫名的火了一把。關于的第一個,其實就是聲明一個常量,不允許變更。另外對象迭代這里出自,阮一峰大神寫的入門指南,對象篇。 兩日前,發了一篇吐槽,莫名的火了一把。經過大家的建議與鼓勵,于是修改了簡歷,開始了重新投遞,2天后接到第一份面試邀請。 此文為個人面試經歷,QA問答過程與總結,不透露面試公司及面試人員,內容真實,如果有面試過我的大佬看到博客,歡迎指出問題。 循序...
摘要:對于直接量和局部變量的訪問性能差異微不足道,性能消耗代價高一些的是全局變量數組項對象成員。當一個函數被創建后,作用域鏈中被放入可訪問的對象。同樣會改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運行 從加載和運行角度優化,源于JavaScript運行會阻塞UI更新,JavaScript腳本的下載、解析...
摘要:對于直接量和局部變量的訪問性能差異微不足道,性能消耗代價高一些的是全局變量數組項對象成員。當一個函數被創建后,作用域鏈中被放入可訪問的對象。同樣會改變作用域鏈,帶來性能問題。 早前閱讀高性能JavaScript一書所做筆記。 一、Loading and Execution 加載和運行 從加載和運行角度優化,源于JavaScript運行會阻塞UI更新,JavaScript腳本的下載、解析...
摘要:每一個執行上下文可以訪問的對象包括自身的作用域和父執行上下文的作用域和父父執行上下文作用域直到全局作用域,這就產生了作用域鏈。語句結束后,作用域鏈恢復正常。 0、自己理解 代碼執行或函數調用生成執行上下文(只有當前執行上下文有執行權),該執行上下文內只能訪問當前執行上下文的變量、函數和上一級執行上下文中的變量、函數,激活下一個執行上下文的時候執行權轉移到新的執行上下文,形成執行上下文棧...
閱讀 1843·2021-11-11 16:55
閱讀 1459·2019-08-30 15:54
閱讀 780·2019-08-29 15:34
閱讀 2262·2019-08-29 13:11
閱讀 2915·2019-08-26 13:28
閱讀 1885·2019-08-26 10:49
閱讀 1002·2019-08-26 10:40
閱讀 2562·2019-08-23 18:21