第九章 類和子產品
- 在javascript中,類的實作都是基于其原型繼承機制的:如果兩個執行個體從一個原型對象上繼承屬性,那麼我們說他們是同一個類的執行個體
- 如果定義了一個原型對象,再定一個一個對象通過inherit()函數繼承自它,就定義了一個js類。但通常還需要通過定義一個函數來建立并初始化這個執行個體
- 工廠函數和構造函數建立對象
- 構造函數更加常用,使用new關鍵字調用函數會自動建立一個對象,它不用傳回這個新建立的對象,構造函數會自動建立對象,是以構造函數隻需初始化這個執行個體即可
- 構造函數的prototype屬性被用作新對象的原型,是以通過同一個構造函數建立的對象都是同一個類的成員
- 從某種意義上講,定義一個構造函數即定義一個類,類名首字母要大寫,而普通函數名和方法首字母小寫
- 任何類的方法都可以通過this關鍵字讀取對象的屬性
- 原型對象和類的唯一辨別:當且僅當兩個對象繼承自一個原型對象時,它們才是屬于同一個類的執行個體。若兩個構造函數的prototype屬性指向同一個原型對象,那麼兩個構造函數建立的執行個體屬于同一個類
- instance不會檢查某個執行個體是否由某個構造函數建立,而是檢查它是否繼承自這個構造函數的prototype屬性指向的原型
- constructor屬性:每個javascript函數(ES5中Function.bind()傳回的函數除外)都有一個prototype屬性,這個屬性的值是一個對象,這個對象擁有唯一一個不可枚舉的屬性constructor,constructor屬性的值是一個函數對象
- 構造函數(prototype ->)/(<- 構造函數)原型/(<- 繼承自)執行個體
- javascript中java式的類繼承:執行個體字段/執行個體方法/類字段/類方法;構造函數對象/原型對象/執行個體對象
- 構造函數對象上定義的屬性和方法屬于類字段和類方法
- 原型對象定義的屬性被所有執行個體繼承,如果屬性的值是函數,這個函數就作為執行個體的方法
- javascript中定義類的步驟:1、定義一個構造函數,初始化新對象的執行個體屬性;2、給函數的prototype屬性定義執行個體方法;3、給構造函數定義類字段和類方法
- 可以通過給原型對象添加新的方法來擴充js類
- 如果給Object.prototype添加新屬性,這些屬性是可以被for/in循環到的
- 使用Object.defineProperty()方法可以解決這個問題
- 類和類型
- 三種檢測任意對象的類的方法:instanceof/constructor/構造函數的名字,鴨式辯型
- instance運算符?
- constructor屬性?
- 在兩個不同架構頁面建立兩個數組繼承自兩個相同但互相獨立的原型對象,其中一個頁面的數組不是另一個頁面的Array()構造函數的執行個體,instanceof運算結果是false
- 構造函數的名稱?
- 鴨式辯型?
- javascript中的面向對象技術