国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript實現繼承的三種方式

dack / 2149人閱讀

摘要:導讀中主要有三種實現繼承的方式,分別是構造函數繼承原型繼承組合繼承其中前兩種方式都有其缺陷。方法使用原型繼承避免了構造函數繼承中方法重復拷貝浪費內存的缺陷。

導讀

JavaScript中主要有三種實現繼承的方式,分別是

構造函數繼承

原型繼承

組合繼承

其中前兩種方式都有其缺陷。第三種方式組合繼承則將前兩種方式結合起來,取長補短,是JS繼承最常用的最佳實踐。本文結合代碼和注釋逐一闡述三種繼承方式。

構造函數繼承

構造函數繼承的關鍵: 在Child構造函數中執行Parent.call(this)

function Parent(name) {
  this.name = name;
  this.hobby = [];
  this.speak = function() {
    console.log("Parent speak");
  } // 缺點1:new多個Child時,Parent構造函數中的方法會在每個Child中拷貝一份,浪費內存
}
Parent.prototype.say = function() {
  console.log("Parent say");
} // 缺點2:Parent原型對象上的方法不會被Child繼承
function Child(name, type) {
  Parent.call(this, name); // 構造函數繼承的關鍵
  this.type = type;
}
原型繼承

原型繼承的關鍵: 設置Child原型指向ParentChild.prototype = new Parent()

function Parent(name) {
  this.name = name;
  this.hobby = []; // 缺點:Parent的引用屬性會被所有Child實例共享,互相干擾
}
Parent.prototype.say = function() {
  console.log("Parent say");
}
function Child(type) {
  this.type = type;
}
Child.prototype = new Parent(); // 原型繼承的關鍵
組合繼承(最佳實踐)

組合繼承的關鍵:

屬性使用構造函數繼承 —— 避免了原型繼承中Parent引用屬性被所有Child實例共享的缺陷。

方法使用原型繼承 —— 避免了構造函數繼承中方法重復拷貝、浪費內存的缺陷。

function Parent(name) {
  this.name = name; 
  this.hobby = []; // 屬性放在構造函數中
}
Parent.prototype.say = function() { // 方法放在原型中
  console.log("Parent say");
}
function Child(name, type) {
  Parent.call(this, name);  // Child繼承Parent屬性(構造函數繼承)
  this.type = type;  // Child擴展屬性
}
Child.prototype = Object.create(Parent.prototype);  // Child繼承Parent方法(原型繼承)
Child.prototype.speak = function() { // Child擴展方法
  console.log("Child speak");
}
Child.prototype.constructor = Child; // 修復Child的constructor指向,否則Child的constructor會指向Parent

補充:
對于組合繼承代碼中的Child.prototype = Object.create(Parent.prototype),還有兩種常見的類似寫法是Child.prototype = Parent.prototypeChild.prototype = new Parent(),但這兩種寫法都是有缺陷的,需要避免:

Child.prototype = Parent.prototype,修改Child.prototype就等于修改Parent.prototype,會干擾所有Parent實例。

Child.prototype = new Parent(),Parent構造函數重復調用了兩次(另一處調用是Child構造函數中的Parent.call(this)),浪費效率,且如果Parent構造函數有副作用,重復調用可能造成不良后果。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/98009.html

相關文章

  • 關于創建對象三種寫法 ---- 字面量,new構造器和Object.create()

    摘要:前言重新梳理一下發現以前說的有問題順便比較兩兩寫法之間的差異性使用對象字面量表示法函數字面量運行時間嵌套函數字面量調用方法函數字面量運行時間函數字面量運行時間使用操作符后跟構造函數詳情可參考關于中的運算符構造函數與原型鏈一些理解構造函數原型 前言 PS:2018/04/14: 重新梳理一下發現以前說的有問題,順便比較兩兩寫法之間的差異性. 1、使用對象字面量表示法 console.ti...

    Jiavan 評論0 收藏0
  • Java實現線程三種方式和區別

    摘要:下面我們通過代碼來看一下實現和區別三種實現繼承,重寫方法實現接口,實現方法實現接口,實現方法,帶有返回值和異常如何使用第一種實現方式第二種實現方式第三種實現從代碼可以看出以上提到的區別,,。第二種方式并沒有體現共用同一個。 Java實現線程的三種方式和區別 Java實現線程的三種方式: 繼承Thread 實現Runnable接口 實現Callable接口 區別: 第一種方式繼承T...

    hyuan 評論0 收藏0
  • constructor設計模式

    摘要:對象的構造函數用于創建特定類型的對象既要準備使用對象,也要接收參數,構造函數在創建對象時可以用來設置成員屬性和方法的值。 在經典的面向對象編程語言中,constructor是一個特殊的方法,被用來初始化一個新建的對象,一旦該對象被分配內存話。 在JavaScript中幾乎所有的東西都是一個對象,然而常常引起我們興趣的是對象的constructor。 對象的構造函數用于創建特定類型的對象...

    leanote 評論0 收藏0
  • 面試題:增強一個對象的方法三種方式

    摘要:面試題增強一個對象的方法的三種方式繼承使用這種方式必須滿足的條件是被增強的方法的所在類能被繼承,并且這個對象已經明確知道。所以創建一個類繼承重寫了父類的方法增強了,變成飛了。。。 面試題:增強一個對象的方法的三種方式 1. 繼承 使用這種方式必須滿足的條件是:被增強的方法的所在類能被繼承,并且這個對象已經明確知道。 舉例: 有一個接口Person,里面有一個方法run() pack...

    233jl 評論0 收藏0
  • javascript高程3 學習筆記(三)

    摘要:與執行環境相關的變量對象中有執行環境定義的所有變量和函數作用域鏈代碼在一個環境中執行,便會創建變量對象的一個作用域鏈。 執行環境 執行環境是什么? javascript的解釋器每次開始執行一個函數時,都會為每個函數創建一個執行環境(execution context)。 執行環境定義了變量或者函數有權訪問的其他數據,決定了他們各自的行為。 與執行環境相關的變量對象(...

    avwu 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<