在修飾器的基礎上,可以實現mixin
模式。所謂mixin
模式,就是物件繼承的一種替代方案,中文譯為「混入」(mix in),意為在乙個物件之中混入另外乙個物件的方法。
請看下面的例子。
上面**之中,物件const
foo=
};
class
myclass
{}
object
.assign
(myclass
.prototype
,foo
);
let obj
=new
myclass
();
obj
.foo
()// 'foo'
foo
有乙個foo
方法,通過object.assign
方法,可以將foo
方法「混入」myclass
類,導致myclass
的例項obj
物件都具有foo
方法。這就是「混入」模式的乙個簡單實現。
下面,我們部署乙個通用指令碼mixins.js
,將 mixin 寫成乙個修飾器。
然後,就可以使用上面這個修飾器,為類「混入」各種方法。export
function
mixins
(...
list
);
}
通過import
from
'./mixins'
;
const
foo=
};
@mixins
(foo
)
class
myclass
{}
let obj
=new
myclass
();
obj
.foo
()// "foo"
mixins
這個修飾器,實現了在myclass
類上面「混入」foo
物件的foo
方法。
class
myclass
extends
mybaseclass
上面**中,es6myclass
繼承了mybaseclass
。如果我們想在myclass
裡面「混入」乙個foo
方法,乙個辦法是在myclass
和mybaseclass
之間插入乙個混入類,這個類具有foo
方法,並且繼承了mybaseclass
的所有方法,然後myclass
再繼承這個類。
上面**中,let
mymixin=(
superclass
)=>
class
extends
superclass
};
mymixin
是乙個混入類生成器,接受superclass
作為引數,然後返回乙個繼承superclass
的子類,該子類包含乙個foo
方法。
接著,目標類再去繼承這個混入類,就達到了「混入」foo
方法的目的。
如果需要「混入」多個方法,就生成多個混入類。class
myclass
extends
mymixin
(mybaseclass
)
let c
=new
myclass
();
c
.foo
();// "foo from mymixin"
class
myclass
extends
mixin1
(mixin2
(mybaseclass
))
這種寫法的乙個好處,是可以呼叫super
,因此可以避免在「混入」過程中覆蓋父類的同名方法。
上面**中,每一次let
mixin1=(
superclass
)=>
class
extends
superclass
};
let
mixin2=(
superclass
)=>
class
extends
superclass
};
class
s
}
class
c extends
mixin1
(mixin2(s
))
}
混入
發生時,都呼叫了父類的super.foo
方法,導致父類的同名方法沒有被覆蓋,行為被保留了下來。
new
c().
foo()
// foo from c
// foo from mixin1
// foo from mixin2
// foo from s
ES6裡的修飾器Decorator
修飾器 decorator 是乙個函式,用來修改類的行為。es6 引入了這項功能,目前 babel 轉碼器已經支援decorator 首先,安裝babel core和babel plugin transform decorators。由於後者包括在babel preset stage 0之中,所以改...
ES6裡的修飾器Decorator
修飾器 decorator 是乙個函式,用來修改類的行為。es6 引入了這項功能,目前 babel 轉碼器已經支援decorator 首先,安裝babel core和babel plugin transform decorators。由於後者包括在babel preset stage 0之中,所以改...
es6通過Mixin模擬多繼承
這週在專案中為了實現乙個樹形圖,所以寫了乙個類,隨著功能的增加,這個類越來越多,量也就越來越多,易讀性很低,所以打算按功能將 抽離到新的檔案,就想到了類的繼承,但是一般的類都是單繼承,那麼怎麼實現多繼承呢?引入乙個概念混合模式,在修飾器的基礎上,可以實現mixin模式。所謂mixin模式,就是物件繼...