JavaScript mixin實(shí)現(xiàn)多繼承的方法詳解
本文實(shí)例講述了JavaScript mixin實(shí)現(xiàn)多繼承的方法。分享給大家供大家參考,具體如下:
mixin簡單通俗的講就是把一個(gè)對象的方法和屬性拷貝到另一個(gè)對象上,注意這個(gè)繼承還是有區(qū)別的。js是一種只支持單繼承的語言,畢竟一個(gè)對象只有一個(gè)原型,如果想實(shí)現(xiàn)多繼承,那就簡單暴力的把需要繼承的父類的所有屬性都拷貝到子類上,就是使用mixin啦。
下面所有代碼可以到github上查看完整版。
一個(gè)簡單的mixin
直接上代碼
function extend(destClass, srcClass) { var destProto = destClass.prototype; var srcProto = srcClass.prototype; for (var method in srcProto) { if (!destProto[method]) { destProto[method] = srcProto[method]; } } } function Book(){} Book.prototype.printName = function(){ console.log('I am a book, named hello'); }; function JS(){} extend(JS, Book); var js = new JS(); console.log(js);
現(xiàn)在你應(yīng)該大概了解mixin在做什么。
可以僅僅拷貝某些方法:
function extend(destClass, srcClass, methods) { var srcProto = srcClass.prototype; var destProto = destClass.prototype ; for (var i=0; i<methods.length; i++) { var method = methods[i]; if (!destProto[method]) { destProto[method] = srcProto[method]; } } } function Book() {} Book.prototype.getName = function() {}; Book.prototype.setName = function() {}; function JS() {} extend(JS, Book, ['getName']); var js = new JS(); console.log(js);
mixin實(shí)現(xiàn)多繼承
直接上代碼。
function extend(destClass) { var classes = Array.prototype.slice.call(arguments, 1); for (var i=0; i<classes.length; i++) { var srcClass = classes[i]; var srcProto = srcClass.prototype; var destProto = destClass.prototype; for (var method in srcProto) { if (!destProto[method]) { destProto[method] = srcProto[method]; } } } } function Book() {} Book.prototype.getName = function() {}; Book.prototype.setName = function() {}; function Tech(){} Tech.prototype.showTech = function(){}; function JS() {} extend(JS, Book, Tech); var js = new JS(); console.log(js);
總結(jié)
很多前端庫里都有mixin方法,只是叫法不一樣,比如 jQuery的extend ,文中我們實(shí)現(xiàn)的都是淺拷貝,jQuery中的extend可以實(shí)現(xiàn)深拷貝。很多庫會(huì)使用mixin的方式,將一些工具方法擴(kuò)展到相應(yīng)對象中,實(shí)現(xiàn)代碼復(fù)用。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
Uniapp中嵌入H5并在H5中跳轉(zhuǎn)到APP的指定頁面方法詳解
Uniapp是一款基于Vue.js框架的跨平臺(tái)開發(fā)工具,支持在一套代碼中開發(fā)出運(yùn)行于各大平臺(tái)的應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于Uniapp中嵌入H5并在H5中跳轉(zhuǎn)到APP的指定頁面的相關(guān)資料,需要的朋友可以參考下2023-09-09談?wù)刯s中的prototype及prototype屬性解釋和常用方法
prototype是javascript中筆記難理解的一部分內(nèi)容,下面通過幾個(gè)關(guān)鍵知識點(diǎn)給大家講解js中的prototype,對js中的prototype相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-11-11淺談JS for循環(huán)中使用break和continue的區(qū)別
這篇文章主要介紹了淺談for循環(huán)中使用break和continue的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07原生javascript實(shí)現(xiàn)無間縫滾動(dòng)示例
原生javascript無間縫滾動(dòng)目前支持的是豎向與橫向滾動(dòng),下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-01-01JavaScript中Location.search處理使用方法
本文主要介紹了JavaScript中Location.search處理使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04document.createElement("A")比較不錯(cuò)的屬性
document.createElement("A")比較不錯(cuò)的屬性...2007-08-08你必須知道的Javascript知識點(diǎn)之"深入理解作用域鏈"的介紹
本篇文章小編為大家介紹,你必須知道的Javascript知識點(diǎn)之"深入理解作用域鏈"的介紹。需要的朋友參考下2013-04-04