国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

聊聊JavaScript如何實現繼承及特點

2019-11-19 16:54:11
字體:
來源:轉載
供稿:網友

“繼承”是面向對象編程里面經常提及到的概念,它的目的是實現代碼復用。JavaScript并沒有“類”的概念,那么,它如何實現繼承呢?

(ES6有關鍵字class和extend,繼承的語法與Java等面向對象語言類似,但是,ES6 class,只是JavaScript原型繼承的語法糖而已)

1. 類式繼承

關鍵點:通過構造函數實現繼承。

父類:

function Parent(name) { this.name = name || "parent";}Parent.prototype.say = function() { return this.name;}

子類:

function Child() {}

(1) 父類對象繼承

Child.prototype = new Parent("child");var child = new Child();child.say(); // "child"

特點:使用這種繼承模式,子類不僅僅會繼承父類原型上的方法/屬性,還會繼承父類自身的屬性。

這種模式的缺點是,在初始化父類對象指向給子類原型時,并不確定父類構造函數的初始化參數(Child.prototype = new Parent("child");),而且,往往這些參數并不是子類需要的。

(2) 借用構造函數

改造子類:

function Child(){ Parent.apply(this, arguments);}

特點:使用這種繼承模式,子類只會繼承父類自身的屬性。

缺點很明顯,它無法從原型鏈中繼承任何方法/屬性。

(3) 共享原型

Child.prototype = Parent.prototype;

這種方式的缺點是,子類原型和父類原型共享一個對象,那么,子類如果修改原型,必然會影響父類。

(4) 臨時構造函數

function inherit(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F();}

特點:利用一個空函數F()充當子類和父類之間的代理,既可以實現父類原型方法/屬性的繼承,又可以在子類原型上繼續擴展方法/屬性。

一般,我們可以利用ES5提供的新方法Object.create()來實現此類繼承。

Child.prototype = Object.create(Parent.prototype);

2. 通過復制屬性實現繼承

復制屬性分為淺拷貝深拷貝

淺拷貝不會復制對象類型,只會簡單的將對象引用指向子類,代碼如下:

function extend(parent, child) { var key; for(key in parent) {  if (parent.hasOwnProperty(key)){   child[key] = parent[key];  } } return child;}

深拷貝會做深度復制,如果某個屬性為對象類型,那么,它會復制出該對象的屬性,再拷貝給子類。代碼如下:

function extendDeep(parent, child) { var key; for(key in parent) {  if (parent.hasOwnProperty(key)){   if (typeof parent[key] === 'object') {    child[key] = (parent[key].toString() === "[object Array]")? []:{};    extendDeep(parent[key], child[key]);   } else {    child[key] = parent[key];   }  } } return child;}

3. "借用方法"模式復用父類函數

如果不想實現父子之間的完全繼承,僅僅期望子類實現父類中一個或多個方法,那么可以利用apply, call, bind來調用父類函數,實現復用。

代碼如下:

parent.say.call(child, "hello, child!");

小結

推薦采用“臨時構造函數”模式實現繼承。以上所述是小編給大家介紹的JavaScript如何實現繼承,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山东| 太白县| 赣榆县| 南京市| 盐城市| 大城县| 射洪县| 娱乐| 高陵县| 潢川县| 博客| 黄骅市| 麦盖提县| 英山县| 泾川县| 太和县| 龙川县| 长阳| 湟中县| 佛学| 淮滨县| 永兴县| 繁峙县| 康乐县| 沂水县| 井陉县| 城口县| 清苑县| 凤凰县| 珠海市| 河池市| 广灵县| 额尔古纳市| 长岭县| 嫩江县| 白城市| 虹口区| 尼玛县| 襄城县| 儋州市| 江达县|