1原型prototype
- 簡介
在構造函數中有一個屬性叫 prototype
prototype是一個對象屬性,其屬性值為對象,稱為原型對象
可以通過prototype來添加新的屬性和方法,此時所有該構造函數創建的對象都會具有這些屬性和方法
由該構造函數創建的對象會默認鏈接到該屬性上
語法:
構造函數.prototype.屬性名=值;
構造函數.prototype.方法名=function(){方法定義體};
訪問對象屬性的查找順序:
首先在當前對象中查找對應的實例屬性
如果沒有,就會到該對象關聯的構造函數的prototype屬性中查找,即到原型對象中查找
作用:
對象間共享數據
為"類"(系統內置或自定義)增加新的屬性、方法,並且新增內容對於當前頁面中已經創建的對象也有效
- proto_ _
prototype是一個隱藏屬性,於是為每個對象提供一個叫__proto__的屬性
對象的__proto__ 與創建它的構造函數的 prototype 本質上是同一個東西
__proto__是對象的屬性,是站在對象的角度,來討論其原型對象
prototype是構造函數的屬性,是站在構造函數的角度,來討論其原型屬性
注:由於__proto__是非標準屬性,因此一般不建議使用
- 對象的類型
判斷數據的類型:
使用typeof
可以判斷任意變量的類型
判斷對象的類型時總是返回object
使用instanceof
只能判斷對象是否為某種類型,需要指定判斷的目標數據類型,無法獲取對象的類型名稱
語法:對象 instanceof 數據類型,返回boolean值
獲取對象的類型:
函數有一個name屬性,通過該屬性可以獲取函數的名稱
構造函數的名稱就是對象的類型
- 原型鏈
任何對象都有其原型對象,原型對象也有原型對象,對象的原型對象一直往上找,直到null為止
在這一過程中,有一個 Object 類型的,有很多方法,它就是 Object.prototype,位於頂層
- call和apply
作用:以某個對象的身份來調用另一個對象的方法
語法:
call:方法.call(對象,參數1,參數2...)
apply:方法.apply(對象,參數)
區別:傳參的方式有所不同
第一個參數是相同的,都表示由該對象來調用執行
後面的參數不同
call是逐個傳參,後面參數可以有多個,逗號隔開
apply是以數組形式傳參,後面參數只能有一個,會自動拆分為多個元素傳入
- 繼承
JS中實現繼承的三種方式:
對象冒充繼承,也稱為構造繼承
核心:使用call,以對象冒充的形式調用父類的構造函數,相當於是複製父類的實例屬性給子類
缺點:只能繼承父類構造函數中的屬性和方法,無法繼承原型中的屬性和方法
原型鏈繼承
核心:使用prototype,將父類的實例作為子類的原型
缺點:創建子類實例時,無法向父類構造函數傳參,導致繼承的父類屬性沒有值
組合繼承
對象冒充+原型鏈
7閉包
閉包是JS中特有的現象,如何理解閉包?
在一個函數內部又定義了一個函數,這個定義在內部的函數,就是閉包
閉包就是能夠讀取其他函數內部變量的函數
閉包是在某個作用域內定義的函數,該函數可以訪問這個作用域內的所有變量
從作用上來說,閉包就是將函數內部和函數外部連接起來的一座橋樑
閉包的用途
在函數的外部,可以讀取到函數內部的變量
讓變量的值始終保存在內存中(不會被垃圾回收器回收)
如果內部函數使用外部函數的變量,在外部函數執行完成之前變量會有改變時,內部只能獲取最後改變的值,無法獲取定義時的值,就會產生閉包
解決方式
不在函數內部定義函數,將函數定義在外面,在函數內部調用
為元素附加屬性,用來存儲變量
使用let來定義變量
- JSON
8.1 JSON簡介
JavaScript Object Notation 是一種輕量級的數據交換格式,用於表示JavaScript對象的一種方式
採用與編程語言無關的文本格式,易於閱讀和編寫,同時也易於解析和生成。
8.2 基本用法
語法:{"屬性名":屬性值,"屬性名":屬性值....}
注意:
JSON結構是由一系列的鍵值對所組成,稱為JSON對象
屬性名使用雙引號引起來
JSON和對象字面量的區別:JSON的屬性必須加雙引號,而對象字面量可以不加
使用:
簡單的JSON對象
複合屬性,屬性的值為JSON對象
JSON對象的集合
- 事件操作
9.1 事件流
概念:當一個HTML元素產生事件時,該事件會在當前元素與根元素之間按特定的順序傳播,所有經過的節點都會收到該事件並執行,這個傳播過程就是DOM事件流。
分類:事件冒泡、事件捕獲
9.2 事件冒泡/事件捕獲
事件冒泡:當一個元素上的事件被觸發時,事件從事件源開始,往上冒泡直到頁面的根元素,這一過程被稱為事件冒泡(默認方式)
事件捕獲:當一個元素上的事件被觸發時,事件從頁面的根元素開始,往下直到事件目標元素,這一過程被稱為事件捕獲
阻止事件冒泡 :event.stopPropagation()
9.3 事件代理/事件委託
概念:利用事件冒泡/事件捕獲機制,通過給父元素綁定事件,從而實現對所有子元素的事件管理,無需為每個子元素綁定事件
優點:1.減少事件註冊,降低內存佔用
2.新增元素時實現動態綁定事件
9.4 事件默認行為
概念:當一個事件發生時瀏覽器自己會默認做的事情,如:點擊鏈接時默認會跳轉,右鍵點擊時默認會彈出菜單
阻止事件的默認行為:e.preventDefault();