溫馨提示:想要更好的理解JS繼承方式,須了解構造函數、原型對象、實例化對象、原型鏈等概念
第一種:原型鏈繼承
利用原型鏈的特點進行繼承
function Parent(){ this.name = 'web前端'; this.type = ['JS','HTML','CSS'];}Parent.prototype.Say=function(){ console.log(this.name);}function Son(){};Son.prototype = new Parent();son1 = new Son();son1.Say();以上例子解釋:
①創建一個叫做Parent的構造函數,暫且稱為父構造函數,里面有兩個屬性name、type
②通過Parent構造函數的屬性(即原型對象)設置Say方法,此時,Parent有2個屬性和1個方法
③創建一個叫做Son的構造函數,暫且稱為子構造函數
④設置Son的屬性(即原型對象)值為父構造函數Parent的實例對象,即子構造函數Son繼承了父構造函數Parent,此時Son也有2個屬性和1個方法
⑤對Son構造函數進行實例化,結果賦值給變量son1,即son1為實例化對象,同樣擁有2個屬性和1個方法
⑥輸出son1的Say方法,結果為"web前端"
優點:可以實現繼承
缺點:
①因為Son.prototype(即原型對象)繼承了Parent實例化對象,這就導致了所有Son實例化對象都一樣,都共享有原型對象的屬性及方法。代碼如下:
son1 = new Son();son2 = new Son();son1.type.push('VUE');console.log(son1.type);//['JS','HTML','CSS','VUE']console.log(son2.type);//['JS','HTML','CSS','VUE']結果son1、son2都是['JS','HTML','CSS','VUE']
②Son構造函數實例化對象無法進行參數的傳遞
第二種:構造函數繼承
通過構造函數call方法進行繼承,直接來看代碼:
function Parent(){ this.name = 'web前端'; this.type = ['JS','HTML','CSS'];}function Son(){ Parent.call(this);}son1 = new Son();son1.type.push('VUE');console.log(son1.type);//['JS','HTML','CSS','VUE']son2 = new Son();console.log(son2.type);//['JS','HTML','CSS']以上例子解釋:
①創建父級構造函數Parent,有name、type兩個屬性
②創建子級構造函數Son,函數內部通過call方法調用父級構造函數Parent,實現繼承
③分別創建構造函數Son的兩個實例化對象son1、son2,對son1的type屬性新增元素,son2沒有新增,結果不一樣,說明實現了獨立
優點:
①實現實例化對象的獨立性;
②還可以給實例化對象添加參數
function Parent(name){ this.name = name;}function Son(name){ Parent.call(this,name);}son1 = new Son('JS');console.log(son1);//JSson2 = new Son('HTML');console.log(son2);//HTML缺點:
①方法都在構造函數中定義,每次實例化對象都得創建一遍方法,基本無法實現函數復用
②call方法僅僅調用了父級構造函數的屬性及方法,沒有辦法調用父級構造函數原型對象的方法
新聞熱點
疑難解答
圖片精選