一些面嚮對象語言中支持多繼承,在JavaScript也能實現多繼承,可是有一些侷限,由於在JavaScript中繼承是依賴原型prototype鏈實現的,只有一條原型鏈,因此理論上是不能繼承多個父類的。可是JavaScript很靈活,經過一些技巧方法能夠繼承多個對象的屬性來實現相似的多繼承。javascript
繼承單對象的extend方法:css
//單繼承 屬性複製 var extend = function (target,source) { //遍歷源對象中的屬性 for(var property in source){ //將源對象中的屬性複製到目標對象中 target[property] = source[property]; } //返回目標對象 return target; };
單繼承的測試代碼html
//測試代碼 var book ={ name:'javascript', alike:['css','html5','js'] } var anotherBook = { color :'blue' } extend(anotherBook,book); console.log(anotherBook.name);//javascript console.log(anotherBook.alike);//[ 'css', 'html5', 'js' ] anotherBook.alike.push('ajax'); anotherBook.name = '設計模式'; console.log(anotherBook.name);//設計模式 console.log(anotherBook.alike);//[ 'css', 'html5', 'js', 'ajax' ] console.log(book.name);//javascript console.log(book.alike);//[ 'css', 'html5', 'js', 'ajax' ]
上面的方法能夠實現對一個對象屬性的複製繼承,當傳遞多個對象時,便可實現多繼承。html5
//多繼承 屬性複製 var mix = function () { var i =1,//從第二個參數起爲被繼承的對象 len =arguments.length,//獲取參數長度 target = arguments[0], //第一個對象爲目標對象 arg;//緩存參數對象 for(;i<len;i++){ //緩存當前對象 arg = arguments[i]; //遍歷被繼承對象中的屬性 for(var property in arg){ //將被繼承對象的屬性複製到目標對象中 target[property] = arg[property]; } } //返回目標對象 return target; };
mix方法的做用是將傳入的多個對象的屬性複製到源對象中,這樣便可實現對多個對象的屬性的繼承。另外當使用的時候須要傳入目標對象(第一個參數-須要繼承的對象)時,能夠將它綁定到原生對象Object上,這樣全部的對象均可以擁有這個方法。這樣就能夠在對象上直接調用。java
Object.property.mix = function () { var i=0,//從第一個參數起爲被繼承的對象 len =arguments.length,//獲取參數長度 arg;//緩存參數對象 for(;i<len;i++){ //緩存當前對象 arg = arguments[i]; //遍歷被繼承對象中的屬性 for(var property in arg){ this[property] = arg[property]; } } }