摘要:導(dǎo)讀中主要有三種實(shí)現(xiàn)繼承的方式,分別是構(gòu)造函數(shù)繼承原型繼承組合繼承其中前兩種方式都有其缺陷。方法使用原型繼承避免了構(gòu)造函數(shù)繼承中方法重復(fù)拷貝浪費(fèi)內(nèi)存的缺陷。
導(dǎo)讀
JavaScript中主要有三種實(shí)現(xiàn)繼承的方式,分別是
構(gòu)造函數(shù)繼承
原型繼承
組合繼承
其中前兩種方式都有其缺陷。第三種方式組合繼承則將前兩種方式結(jié)合起來,取長(zhǎng)補(bǔ)短,是JS繼承最常用的最佳實(shí)踐。本文結(jié)合代碼和注釋逐一闡述三種繼承方式。
構(gòu)造函數(shù)繼承構(gòu)造函數(shù)繼承的關(guān)鍵: 在Child構(gòu)造函數(shù)中執(zhí)行Parent.call(this)。
function Parent(name) { this.name = name; this.hobby = []; this.speak = function() { console.log("Parent speak"); } // 缺點(diǎn)1:new多個(gè)Child時(shí),Parent構(gòu)造函數(shù)中的方法會(huì)在每個(gè)Child中拷貝一份,浪費(fèi)內(nèi)存 } Parent.prototype.say = function() { console.log("Parent say"); } // 缺點(diǎn)2:Parent原型對(duì)象上的方法不會(huì)被Child繼承 function Child(name, type) { Parent.call(this, name); // 構(gòu)造函數(shù)繼承的關(guān)鍵 this.type = type; }原型繼承
原型繼承的關(guān)鍵: 設(shè)置Child原型指向ParentChild.prototype = new Parent()。
function Parent(name) { this.name = name; this.hobby = []; // 缺點(diǎn):Parent的引用屬性會(huì)被所有Child實(shí)例共享,互相干擾 } Parent.prototype.say = function() { console.log("Parent say"); } function Child(type) { this.type = type; } Child.prototype = new Parent(); // 原型繼承的關(guān)鍵組合繼承(最佳實(shí)踐)
組合繼承的關(guān)鍵:
屬性使用構(gòu)造函數(shù)繼承 —— 避免了原型繼承中Parent引用屬性被所有Child實(shí)例共享的缺陷。
方法使用原型繼承 —— 避免了構(gòu)造函數(shù)繼承中方法重復(fù)拷貝、浪費(fèi)內(nèi)存的缺陷。
function Parent(name) { this.name = name; this.hobby = []; // 屬性放在構(gòu)造函數(shù)中 } Parent.prototype.say = function() { // 方法放在原型中 console.log("Parent say"); } function Child(name, type) { Parent.call(this, name); // Child繼承Parent屬性(構(gòu)造函數(shù)繼承) this.type = type; // Child擴(kuò)展屬性 } Child.prototype = Object.create(Parent.prototype); // Child繼承Parent方法(原型繼承) Child.prototype.speak = function() { // Child擴(kuò)展方法 console.log("Child speak"); } Child.prototype.constructor = Child; // 修復(fù)Child的constructor指向,否則Child的constructor會(huì)指向Parent
補(bǔ)充:
對(duì)于組合繼承代碼中的Child.prototype = Object.create(Parent.prototype),還有兩種常見的類似寫法是Child.prototype = Parent.prototype和Child.prototype = new Parent(),但這兩種寫法都是有缺陷的,需要避免:
Child.prototype = Parent.prototype,修改Child.prototype就等于修改Parent.prototype,會(huì)干擾所有Parent實(shí)例。
Child.prototype = new Parent(),Parent構(gòu)造函數(shù)重復(fù)調(diào)用了兩次(另一處調(diào)用是Child構(gòu)造函數(shù)中的Parent.call(this)),浪費(fèi)效率,且如果Parent構(gòu)造函數(shù)有副作用,重復(fù)調(diào)用可能造成不良后果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98009.html
摘要:前言重新梳理一下發(fā)現(xiàn)以前說的有問題順便比較兩兩寫法之間的差異性使用對(duì)象字面量表示法函數(shù)字面量運(yùn)行時(shí)間嵌套函數(shù)字面量調(diào)用方法函數(shù)字面量運(yùn)行時(shí)間函數(shù)字面量運(yùn)行時(shí)間使用操作符后跟構(gòu)造函數(shù)詳情可參考關(guān)于中的運(yùn)算符構(gòu)造函數(shù)與原型鏈一些理解構(gòu)造函數(shù)原型 前言 PS:2018/04/14: 重新梳理一下發(fā)現(xiàn)以前說的有問題,順便比較兩兩寫法之間的差異性. 1、使用對(duì)象字面量表示法 console.ti...
摘要:下面我們通過代碼來看一下實(shí)現(xiàn)和區(qū)別三種實(shí)現(xiàn)繼承,重寫方法實(shí)現(xiàn)接口,實(shí)現(xiàn)方法實(shí)現(xiàn)接口,實(shí)現(xiàn)方法,帶有返回值和異常如何使用第一種實(shí)現(xiàn)方式第二種實(shí)現(xiàn)方式第三種實(shí)現(xiàn)從代碼可以看出以上提到的區(qū)別,,。第二種方式并沒有體現(xiàn)共用同一個(gè)。 Java實(shí)現(xiàn)線程的三種方式和區(qū)別 Java實(shí)現(xiàn)線程的三種方式: 繼承Thread 實(shí)現(xiàn)Runnable接口 實(shí)現(xiàn)Callable接口 區(qū)別: 第一種方式繼承T...
摘要:對(duì)象的構(gòu)造函數(shù)用于創(chuàng)建特定類型的對(duì)象既要準(zhǔn)備使用對(duì)象,也要接收參數(shù),構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)可以用來設(shè)置成員屬性和方法的值。 在經(jīng)典的面向?qū)ο缶幊陶Z言中,constructor是一個(gè)特殊的方法,被用來初始化一個(gè)新建的對(duì)象,一旦該對(duì)象被分配內(nèi)存話。 在JavaScript中幾乎所有的東西都是一個(gè)對(duì)象,然而常常引起我們興趣的是對(duì)象的constructor。 對(duì)象的構(gòu)造函數(shù)用于創(chuàng)建特定類型的對(duì)象...
摘要:面試題增強(qiáng)一個(gè)對(duì)象的方法的三種方式繼承使用這種方式必須滿足的條件是被增強(qiáng)的方法的所在類能被繼承,并且這個(gè)對(duì)象已經(jīng)明確知道。所以創(chuàng)建一個(gè)類繼承重寫了父類的方法增強(qiáng)了,變成飛了。。。 面試題:增強(qiáng)一個(gè)對(duì)象的方法的三種方式 1. 繼承 使用這種方式必須滿足的條件是:被增強(qiáng)的方法的所在類能被繼承,并且這個(gè)對(duì)象已經(jīng)明確知道。 舉例: 有一個(gè)接口Person,里面有一個(gè)方法run() pack...
摘要:與執(zhí)行環(huán)境相關(guān)的變量對(duì)象中有執(zhí)行環(huán)境定義的所有變量和函數(shù)作用域鏈代碼在一個(gè)環(huán)境中執(zhí)行,便會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。 執(zhí)行環(huán)境 執(zhí)行環(huán)境是什么? javascript的解釋器每次開始執(zhí)行一個(gè)函數(shù)時(shí),都會(huì)為每個(gè)函數(shù)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context)。 執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們各自的行為。 與執(zhí)行環(huán)境相關(guān)的變量對(duì)象(...
閱讀 2425·2021-10-09 09:44
閱讀 2171·2021-10-08 10:05
閱讀 3452·2021-07-26 23:38
閱讀 3033·2019-08-28 18:16
閱讀 846·2019-08-26 11:55
閱讀 1846·2019-08-23 18:29
閱讀 2083·2019-08-23 18:05
閱讀 1384·2019-08-23 17:02