
本節的代碼在mixin.ts文件內

同時在index.ts內引入

混入就是把兩個對象或者類的內容混合到一起,從而實現一些功能復用。
對象混入
js中對象的混入
先來看一個js中對象的混入的例子
首先定義一個對象a
在定義一個對象b
a里面混入一個對象b讓a里面有對象b的屬性
使用es6的Object.assign方法,a寫在前面,b寫在后面

a里面就也有了b對象的屬性

b還是只有b屬性

ts中對象混入
在ts中,是具有類型系統的

AB現在就是一個交叉類型,這是ts自動幫你推斷出來的

當然你也可以指定它的類型是ObjectA和ObjectB的交叉類型,交叉類型就表示它既包含A的特性,又包含B的特性。
類的混入
看下js中類的混入
定義類A和B,輸出類A和類B,分別有funcA和funcB

Object.getOwnPropertyNames()可以獲取對象自身的屬性,除去他繼承來的屬性,
對它所有的屬性遍歷,它是一個數組,遍歷一下它所有的屬性名

base原型對象上,添加到遍歷的屬性

調用mixins2,把兩個原型對象傳進去
b.pertotype就是b的原型對象
a.pertotype就是a的原型對象
調用了mixins2這個方法,傳進去b的原型對象和a的原型對象

創建b的實例,並輸出這個b,發現里面既有funcA也有funcB

調用b.funcA() 打印出了here

這就是js中對類的混入
ts中對類的混入
ts中還要處理對類型的定義
把兩個類當做接口來繼承,AB繼承classAa和ClassBb,繼承多個接口用逗號分隔開

繼承了兩個類以后,這里要把兩個類里面的所有屬性和方法都要在這里定義一下

定義一個函數mixins,從from里面forEach遍歷一下,因為傳入進來是一個數組,它是要混入的兩個類組成的數組,要遍歷它

通過Object.getOwnPropertyNames獲取當前遍歷的原型對象,獲取它原型對象上定義的所有屬性,返回的也是一個數組
也需要遍歷他

給base添加當前遍歷的這個原型對象上的屬性

調用混入的方法

創建classAB的實例,並輸出,輸出的funcA和funcB是有實際的函數體的

classAB這里只需要定義函數的類型就可以,實際的方法體是從ClassAa和ClassBb里面繼承過來的

可以看到下划線proto下划線這個下面有繼承來的兩個方法funcA和funcB

通過mixins函數,將這個ClassAa和ClassBb原型對象的屬性和方法賦給ClassAB
因為ClassAa和ClassBb有函數funcA和funcB的類型定義,所以可以吧funcA和funcB的函數實體直接賦給ClassAB,這個就是ts中的混入
