ES5中的原型鏈和繼承


JavaScript中所有對象都是Object的實例,並且都繼承Object.prototype的屬性和方法。也就是說,所有的對象都有prototype屬性。
__proto__constructor屬性是對象所獨有的;
② prototype屬性是函數所獨有的。但是由於JS中函數也是一種對象,所以函數也擁有__proto__constructor屬性,這點是致使我們產生困惑的很大原因之一。
每個構造函數都有一個prototype屬性,指向它的原型對象,而且構造函數生成的每個實例也都有一個指向原型對象的內部指針。原型對象上的屬性和方法是它所屬構造函數生成的實例共享的。
原型鏈
訪問一個實例屬性時, 首先會在當前實例中搜索該屬性,如果沒找到,則會繼續搜索實例的原型對象,如果我們將原型對象等於其他構造函數生成的實例,則原型對象將包含一個指向另一個原型的指針,相應地,另一個原型也可以指向其他實例,這樣就構成了實例與原型的之間的鏈條,這就是原型鏈。
查找會沿着原型鏈向上,直達找到這個屬性或者到達原型鏈末端才會停下來,這是比較消耗內存的,所以我們不能將原型鏈定義得太長。
執行上下文
當調用一個函數時,就會為該函數創建一個執行上下文,可以理解為“代碼的執行環境”,一個執行上下文的生命周期可以分為兩個階段:
1.創建階段
在這個階段中,執行上下文會分別創建變量對象,建立作用域鏈,以及確定this的指向。
2.代碼執行階段
創建完成之后,就會開始執行代碼,這個時候,會完成變量賦值,函數引用,以及執行其他代碼。
作用域
作用域是js引擎根據名稱查找變量的一套規則。
當存在多個作用域嵌套時,就形成了作用域鏈。作用域鏈是在執行上下文的創建階段確定的,它只與函數聲明位置有關。
無論函數在哪里被調用,也無論它如何被調用,它的詞法作用域都只由函數被聲明時所處的位置決定。 ——《你不知道的JavaScript 上卷》P16
如果js引擎在當前作用域中查找不到某個變量,就會到外層作用域查找。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM