JavaScript原型與閉包總結

/**僅記錄自己的學習歷程,爲以後的自己留個參考**/


原型那一塊確實有點繞,但是理解之後會發現JS還是很神奇的,這一塊知識可以參考http://www.cnblogs.com/wangfupeng1988/p/3977924.html,作者寫的還是很用心的


1.判斷一個變量是不是對象

(1)值類型的類型判斷用typeof

(2)引用類型的類型判斷用instanceof


2.JS中一切(引用類型)都是對象,對象是屬性的集合


3.爲函數添加屬性

在jQuery中,"jQuery"或"$"這個變量其實就是一個函數

typeof $ ---> function

$.trim() ---> 爲$函數加了一個trim屬性


4.在typeof的輸出類型中,function和object都是對象,爲何要輸出兩種

函數和數組都是對象,數組好比對象的一個子集,而函數和對象之間卻不僅僅是一種包含和被包含的關係,有一點雞生蛋蛋生雞的關係。

對象都是通過函數創建的!!!

typeof Object --->function

typeof Array--->function


5.每個函數都有一個默認的屬性prototype,這個prototype的屬性值是一個對象(屬性的集合),默認只有一個叫做constructor的屬性,指向這個函數本身。


6.每個對象都有一個隱藏的屬性——__proto__,這個屬性引用了創建這個對象的函數的prototype!

能清楚地解釋以下語句的輸出原因,你就理解了:var a=[ ]; a.constructor--->function Array()


7.自定義函數的prototype本質上就是和var obj={ }是一樣的,都是被Object創建,所以它的__proto__指向就是Object.prototype(特例:Object.prototype指向null)


8.函數也是一種對象,同樣有__proto__,誰創建了函數?--->Function

對象的__proto__指向的是創建它的函數的prototype,所以:Object.__proto__ === Function.prototype


9.Function也是一個函數,函數是一種對象,也有__proto__屬性,既然是函數,那麼它一定是被Function創建,所以Function是被自身創建的,所以它的__proto__指向自身的prototype。


10.因爲Function.prototype指向的對象也是一個普通的被Object()創建的對象,所以它的__proto__也指向Object.prototype。


11.instanceof運算符的第一個變量是一個對象,暫時稱爲A;第二個變量一般是一個函數,暫時稱爲B。

instanceof判斷準則:沿着A的__proto__這條線來找,同時沿着B的prototype這條線來找,如果兩條線能找到同一個引用,即同一個對象,那麼就返回true。


12.訪問一個對象的屬性時,先在基本屬性中查找,如果沒有,再沿着__proto__這條鏈向上找,這就是原型鏈。

由於所有的對象的原型鏈都會找到Object.prototype,因此所有的對象都會有Object.prototype的方法,這就是繼承。

原型鏈




























13.執行上下文環境:在執行代碼之前,把將要用到的所有變量都事先拿出來,有的直接賦值了,有的先用undefined佔個位


14.執行上下文

變量、函數表達式——變量聲明,默認賦值爲undefined

this——賦值

函數聲明——賦值

*JS在執行一個代碼段之前,都會進行這些準備工作來生成執行上下文

*代碼段分三種情況:全局代碼、函數體、eval代碼


15.函數每被調用一次,都會產生一個新的執行上下文環境,函數在定義的時候(不是調用的時候)就已經確定了函數體內部自由變量的作用域

函數體的執行上下文

參數——賦值

arguments——賦值

自由變量的取值作用域——賦值

16.this取值(5種情況)——this指向調用該函數的對象

(1)如果函數作爲構造函數,其中this代表它即將new出來的對象

(2)函數作爲對象的一個屬性,並且作爲對象的一個屬性被調用時,函數中的this指向該對象

如果函數被賦值到另一個變量中,並沒有作爲obj的一個屬性被調用,那麼this的值就是Window

var obj={

fn:function(){

console.log(this);--->this指向Window

}

}

var fn1=obj.fn;


fn1();

(3)當一個函數被call或apply調用時,this的值就取傳入的對象

(4)在全局環境下或調用普通函數,this永遠是Window

(5)不僅僅是構造函數的prototype,即便在整個原型鏈中,this代表當前對象


17.JS中沒有塊級作用域,JS中除了全局作用域之外,只有函數可以創建作用域。所以在聲明變量時,全局代碼要在代碼前端聲明,函數中要在函數體一開始就聲明好,其它地方不用出現變量聲明,而且建議使用單var形式。

18.在A作用域中使用變量x,卻沒有在A作用域中聲明,那麼對於A作用域來說,x就是一個自由變量


19.作用域有上下級關係,上下級關係的確定就看函數是在哪個作用域下創建的。

對於自由變量,要到創建這個函數的那個作用域中取值(創建,而不是調用)



發佈了25 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章