一.物件在js中被稱為引用型別的值,而且有一些內建的引用型別可以用來建立特定的物件,總結如下:
1.引用型別與傳統物件導向程式設計中的類相似,但實現不同。
2.object是乙個基礎型別,其他所有型別都從object繼承了基本的行為。
3.array型別是一組值的有序列表,同時還提供了操作和轉換這些值的功能。
4.date型別提供了日期和時間的資訊,包括當前日期和時間,以及相關的計算功能。
5.regexp型別是es中支援正規表示式的乙個介面,提供了一些最基本的和一些高階的正規表示式功能。
二.函式實際上是function型別的例項,所以函式也是物件,也有屬性和方法,可以用來增強其行為。
三.因為有了基本包裝型別,所以js中的基本型別值可以被當做物件來訪問,3種基本包裝型別:boolean,number,string,共同特徵如下:
1.每個包裝型別都會對映到同名的基本型別。
2.在讀取模式訪問基本型別值時,就會建立對應的基本包裝型別的乙個物件,從而方便了讀取資料操作。
3.操作基本型別值的語句一經執行完畢,就會立即銷毀新建立的基本包裝型別的物件。
四.在所有**執行之前,作用域中就存在兩個內建物件:global和math物件。在大多數es實現中都不能直接訪問global物件。在web瀏覽器中實現了承擔該物件角色的window物件。全域性變數和函式都是global物件的屬性。math物件提供了很多屬性和方法,輔助完成複雜的數學計算任務。
五.es支援物件導向程式設計,但不使用類或介面。物件可以在**執行過程中建立和增強,因此具有動態性而非嚴格定義的實體。在沒有類的情況下,可採用下列模式建立物件:
1.工廠模式:
使用簡單的函式建立物件,為物件新增屬性和方法,然後返回物件。後來被建構函式模式所取代!
2.建構函式模式:
可以建立自定義引用型別,可以像建立內建物件例項一樣使用new操作符。
缺:它的每個成員都無法得到復用,包括函式。由於函式可以不侷限於任何物件,所以沒有理由不在多個物件間共享函式。
3.原型模式:
使用建構函式的prototype屬性來指定那些應該共享的屬性和方法。
組合使用建構函式模式和原型模式時,使用建構函式定義例項屬性,使用原型定義共享的屬性和方法。
六.js主要通過原型鏈實現繼承,原型鏈的構建是通過將乙個型別的例項賦值給另乙個建構函式的原型實現的。
這樣,子類就能夠訪問超型別的所有屬性和方法,這一點與基於類的繼承很相似。問題:物件例項共享所有繼承的屬性和方法,因此不適宜單獨使用。
**借用建構函式模式可以解決原型鏈繼承的問題。即:在子類建構函式的內部呼叫超型別建構函式,這樣就能做到每個例項都具有自己的屬性,同時還能保證只使用建構函式模式來定義型別。
**組合繼承(最多):使用原型鏈繼承共享的屬性和方法,通過借用建構函式繼承例項屬性。2
此外還存在其他繼承模式:
1.原型式繼承:
可以在不 預先定義建構函式的情況下實現繼承,本質是執行給定物件的淺複製,複製到的副本還可以得到進一步改造。
2.寄生式繼承:
與原型式繼承非常相似,也是基於某個物件或某些資訊建立乙個物件,然後增強物件,最後返回物件。
3.寄生組合式繼承:(為了解決組合繼承模式由於多次呼叫超型別建構函式而導致的低效率問題)
集寄生式繼承和組合式繼承的優點於一身,是實現基於型別繼承的最有效方式。
七.在js中,表示式是一種非常有用的技術。使用表示式可以無需對函式命名,從而實現動態程式設計。匿名函式也成為拉姆達函式,是一種使用js函式的強大方式。
1.函式表示式不同於函式宣告,函式宣告要求有名字,但函式表示式不需要。沒有名字的函式表示式也叫匿名函式。
2.在無法確定如何引用函式的情況下,遞迴函式就會變得比較複雜。
3.遞迴函式應該始終使用argumnets.callee來遞迴的呼叫自身,不要使用函式名,因為函式名可能會隨時發生變化。
八.當在函式內部定義其他函式時,就建立了閉包。閉包有權訪問函式內部的所有變數,原理如下:
1.在後台執行環境中,閉包的作用域包含著它自己的作用域,包含函式的作用域和全域性作用域。
2.通常,函式的作用域及其所有變數在函式執行完畢都會被銷毀。
3.但是,當函式返回了乙個閉包時,這個函式的作用域將會一直儲存在記憶體中直到閉包不存在為止。
九.使用閉包可以在js中模仿塊級作用域,要點如下:
1.建立並立即呼叫乙個函式,這樣既可以執行其中的**,又不會再記憶體中留下對該函式的引用。
2.結果就是函式內部的所有變數都會被立即銷毀,除非將某些變數賦值給了包含函式中的變數。
十.閉包還可以用於在物件中建立私有變數,要點如下:
1.即使js中沒有正式的私有物件屬性的概念,但可以使用閉包來實現共有方法,而通過公有方法可以訪問在包含作用域中定義的變數。
2.有權訪問私有變數的公有方法叫做特權方法。
3.可以使用建構函式模式,原型模式 來實現自定義型別的特權方法,也可以使用模組模式,增強的模組模式來實現單例的特權方法。
注:建立閉包必須維護額外的作用域,過度使用它們可能會占用大量記憶體。
js高階知識小結 三
1 什麼是物件導向?是一種程式設計思想 將屬性和方法封裝在一起,然後通過.語法呼叫 2 物件導向好處 a 物件導向思維方式是一種更符合人們思考習慣的思想 b 面向過程思維方式中更多的體現的是執行者 自己做事情 物件導向中更多的體現是指揮者 指揮物件做事情 c 物件導向思維方式將複雜的問題簡單化。3 ...
JS高階程式設計讀書筆記 第3章
一 資料型別 謹記兩大類6小類 第一類基本資料型別 簡單資料型別 undefined null number string boolean 第二類複雜資料型別 引用資料型別 object 個人理解,它的值是乙個記憶體位址,例如 0x00000000 但是又因為指向這個位址,所以可以引用這個位址的儲存...
JS高階程式設計 第三章開始
三.基本概念 1.typeof 操作符 檢測資料型別 總共undefined boolean string number object function這6種型別 1.1 undefined 未宣告或未初始化 變數宣告之後預設取得了 undefined 值 1.2 null 空指標 定義的變數準備在...