日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JS繼承實現方法及優缺點詳解

瀏覽:155日期:2024-04-22 13:27:47

前言

JS作為面向對象的弱類型語言,繼承也是其非常強大的特性之一。那么如何在JS中實現繼承呢?讓我們拭目以待。

JS繼承的實現方式

既然要實現繼承,那么首先我們得有一個父類,代碼如下:

// 定義一個動物類function Animal (name) { // 屬性 this.name = name || ’Animal’; // 實例方法 this.sleep = function(){ console.log(this.name + ’正在睡覺!’); }}// 原型方法Animal.prototype.eat = function(food) { console.log(this.name + ’正在吃:’ + food);};

1、原型鏈繼承

核心: 將父類的實例作為子類的原型

function Cat(){ }Cat.prototype = new Animal();Cat.prototype.name = ’cat’;// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.eat(’fish’));console.log(cat.sleep());console.log(cat instanceof Animal); //true console.log(cat instanceof Cat); //true

特點:

非常純粹的繼承關系,實例是子類的實例,也是父類的實例 父類新增原型方法/原型屬性,子類都能訪問到 簡單,易于實現

缺點:

要想為子類新增屬性和方法,必須要在new Animal()這樣的語句之后執行,不能放到構造器中

無法實現多繼承

來自原型對象的所有屬性被所有實例共享(來自原型對象的引用屬性是所有實例共享的)(詳細請看附錄代碼: 示例1)創建子類實例時,無法向父類構造函數傳參

推薦指數:★★(3、4兩大致命缺陷)

2017-8-17 10:21:43補充:感謝 MMHS 指出。缺點1中描述有誤:可以在Cat構造函數中,為Cat實例增加實例屬性。如果要新增原型屬性和方法,則必須放在new Animal()這樣的語句之后執行。

2018-9-10 00:03:45補充:感謝 IRVING_J 指出。缺點3中的描述不夠充分。更正為:來自原型對象的所有屬性被所有實例共享。

2、構造繼承

核心:使用父類的構造函數來增強子類實例,等于是復制父類的實例屬性給子類(沒用到原型)

function Cat(name){ Animal.call(this); this.name = name || ’Tom’;}// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.sleep());console.log(cat instanceof Animal); // falseconsole.log(cat instanceof Cat); // true

特點:

解決了1中,子類實例共享父類引用屬性的問題 創建子類實例時,可以向父類傳遞參數 可以實現多繼承(call多個父類對象)

缺點:

實例并不是父類的實例,只是子類的實例 只能繼承父類的實例屬性和方法,不能繼承原型屬性/方法 無法實現函數復用,每個子類都有父類實例函數的副本,影響性能

推薦指數:★★(缺點3)

3、實例繼承

核心:為父類實例添加新特性,作為子類實例返回

function Cat(name){ var instance = new Animal(); instance.name = name || ’Tom’; return instance;}// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.sleep());console.log(cat instanceof Animal); // trueconsole.log(cat instanceof Cat); // false

特點:

不限制調用方式,不管是new 子類()還是子類(),返回的對象具有相同的效果

缺點:

實例是父類的實例,不是子類的實例 不支持多繼承

推薦指數:★★

4、拷貝繼承

function Cat(name){ var animal = new Animal(); for(var p in animal){ Cat.prototype[p] = animal[p]; } Cat.prototype.name = name || ’Tom’;}// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.sleep());console.log(cat instanceof Animal); // falseconsole.log(cat instanceof Cat); // true

特點:

支持多繼承

缺點:

效率較低,內存占用高(因為要拷貝父類的屬性) 無法獲取父類不可枚舉的方法(不可枚舉方法,不能使用for in 訪問到)

推薦指數:★(缺點1)

5、組合繼承

核心:通過調用父類構造,繼承父類的屬性并保留傳參的優點,然后通過將父類實例作為子類原型,實現函數復用

function Cat(name){ Animal.call(this); this.name = name || ’Tom’;}Cat.prototype = new Animal();// 感謝 @學無止境c 的提醒,組合繼承也是需要修復構造函數指向的。Cat.prototype.constructor = Cat;// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.sleep());console.log(cat instanceof Animal); // trueconsole.log(cat instanceof Cat); // true

特點:

彌補了方式2的缺陷,可以繼承實例屬性/方法,也可以繼承原型屬性/方法 既是子類的實例,也是父類的實例 不存在引用屬性共享問題 可傳參 函數可復用

缺點:

調用了兩次父類構造函數,生成了兩份實例(子類實例將子類原型上的那份屏蔽了)推薦指數:★★★★(僅僅多消耗了一點內存)

6、寄生組合繼承

核心:通過寄生方式,砍掉父類的實例屬性,這樣,在調用兩次父類的構造的時候,就不會初始化兩次實例方法/屬性,避免的組合繼承的缺點

function Cat(name){ Animal.call(this); this.name = name || ’Tom’;}(function(){ // 創建一個沒有實例方法的類 var Super = function(){}; Super.prototype = Animal.prototype; //將實例作為子類的原型 Cat.prototype = new Super();})();// Test Codevar cat = new Cat();console.log(cat.name);console.log(cat.sleep());console.log(cat instanceof Animal); // trueconsole.log(cat instanceof Cat); //true感謝 @bluedrink 提醒,該實現沒有修復constructor。Cat.prototype.constructor = Cat; // 需要修復下構造函數

感謝 @bluedrink 提醒,該實現沒有修復constructor。

Cat.prototype.constructor = Cat; // 需要修復下構造函數

特點:

堪稱完美

缺點:

實現較為復雜

推薦指數:★★★★(實現復雜,扣掉一顆星)

附錄代碼:

示例一:

function Animal (name) { // 屬性 this.name = name || ’Animal’; // 實例方法 this.sleep = function(){ console.log(this.name + ’正在睡覺!’); } //實例引用屬性 this.features = [];}function Cat(name){}Cat.prototype = new Animal();var tom = new Cat(’Tom’);var kissy = new Cat(’Kissy’);console.log(tom.name); // 'Animal'console.log(kissy.name); // 'Animal'console.log(tom.features); // []console.log(kissy.features); // []tom.name = ’Tom-New Name’;tom.features.push(’eat’);//針對父類實例值類型成員的更改,不影響console.log(tom.name); // 'Tom-New Name'console.log(kissy.name); // 'Animal'//針對父類實例引用類型成員的更改,會通過影響其他子類實例console.log(tom.features); // [’eat’]console.log(kissy.features); // [’eat’]

原因分析:

關鍵點:屬性查找過程

執行tom.features.push,首先找tom對象的實例屬性(找不到),

那么去原型對象中找,也就是Animal的實例。發現有,那么就直接在這個對象的features屬性中插入值。

在console.log(kissy.features); 的時候。同上,kissy實例上沒有,那么去原型上找。

剛好原型上有,就直接返回,但是注意,這個原型對象中features屬性值已經變化了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人精品一区| 日韩免费av| 日韩国产一区| 日韩av网站免费在线| 亚洲深夜福利在线观看| 99成人在线| 精品91久久久久| 亚洲作爱视频| 99在线精品免费视频九九视| 激情欧美亚洲| 夜夜嗨网站十八久久| 午夜亚洲一区| 亚欧洲精品视频在线观看| 日韩精品亚洲一区二区三区免费| 亚州精品视频| 国产精品毛片视频| 久久精品国产在热久久| 欧美国产精品| 国产激情一区| 水蜜桃久久夜色精品一区| av高清不卡| 欧美一区不卡| 久久一区国产| 欧美一级鲁丝片| 1024精品一区二区三区| 性色一区二区| 日本中文字幕一区二区视频| 国产欧美午夜| 成人国产精选| 五月婷婷六月综合| 久久亚洲国产精品一区二区| 91精品国产自产精品男人的天堂 | 国产精品一级| 精品九九久久| 久久久久久久久丰满| 亚洲一区日本| 国产乱码精品一区二区三区四区 | 午夜久久av| 国产精品欧美日韩一区| 97精品国产| 日韩精品一页| 四虎国产精品免费观看| 美女久久久久| 亚洲欧美高清| 国产欧美日韩精品一区二区免费| 精品视频在线观看网站| 国户精品久久久久久久久久久不卡| 国产亚洲一区在线| 日本视频中文字幕一区二区三区| 精品免费av| 亚洲精品午夜av福利久久蜜桃| 亚洲tv在线| 日韩免费看片| 亚洲欧美在线专区| 九九99久久精品在免费线bt| 在线精品小视频| 国产欧美日韩影院| 人人精品亚洲| 亚洲毛片一区| 福利一区和二区| 一区二区亚洲视频| 伊人久久视频| 日韩av在线免费观看不卡| 97精品中文字幕| 亚洲精品三级| 国产精品毛片久久| 美女被久久久| 日韩免费看片| 91亚洲精品视频在线观看| 三级小说欧洲区亚洲区| 18国产精品| 九九综合九九| 精品亚洲成人| 日本欧洲一区二区| 日本黄色精品| 欧美在线黄色| 欧美91福利在线观看| 国产精品videossex| 丝袜a∨在线一区二区三区不卡| 久久香蕉精品香蕉| 影音先锋久久精品| 青青久久av| 国产激情一区| 亚洲青青久久| 欧美~级网站不卡| 久久精品一区二区三区中文字幕| 久久国产高清| 99精品视频精品精品视频| 91欧美精品| 亚洲欧美高清| 欧美日韩精品一区二区视频| 老牛国内精品亚洲成av人片| 日韩av不卡在线观看| 99成人在线| 亚洲二区免费| 裤袜国产欧美精品一区| 国产精品调教| 日本成人中文字幕| 中文精品视频| 国户精品久久久久久久久久久不卡| 国产精品久久观看| 国产精品日韩精品中文字幕| 综合一区av| 亚洲精品一区二区妖精| 在线天堂中文资源最新版| 国产精品777777在线播放| 亚洲日韩中文字幕一区| 亚州av乱码久久精品蜜桃| 久久久久91| 超碰99在线| 欧美1区2区3| 国产毛片精品| 欧美日韩在线精品一区二区三区激情综合 | 久草精品视频| 国产精品色在线网站| 日韩av资源网| 日韩国产精品久久久久久亚洲| 久久成人国产| 久久亚洲风情| 久久av一区| 免费成人在线影院| 国产视频一区在线观看一区免费| 亚洲网站视频| 欧美手机在线| 久久亚洲国产| 亚洲天堂一区二区| 精品丝袜在线| 色偷偷偷在线视频播放| 欧美有码在线| 国产精品magnet| 国产色99精品9i| 国产精品高潮呻吟久久久久| 欧美日韩一区二区高清| 欧美亚洲一区二区三区| 国产亚洲电影| 国产欧美日韩影院| 欧美成人精品午夜一区二区| 国产精品www994| 精品国产午夜肉伦伦影院| 久久一区欧美| 日韩在线不卡| 成人久久一区| 午夜在线一区| 蜜桃传媒麻豆第一区在线观看| 亚洲精品少妇| 国产精品丝袜在线播放| 精品视频在线观看网站| 国产精品蜜芽在线观看| 久久精品亚洲人成影院 | 性欧美xxxx免费岛国不卡电影| 日韩精品一卡| 午夜久久久久| 亚洲精品女人| 国产日产一区| 精品91福利视频| 精品国模一区二区三区| 欧美在线亚洲| 日韩一区中文| 国产极品模特精品一二| 日韩成人精品一区二区| 999国产精品视频| 亚洲欧美日韩国产一区二区| 91在线成人| 成人午夜精品| 亚洲欧美日韩精品一区二区| 国产免费播放一区二区| 日韩欧美一区二区三区免费看| 午夜免费一区| 日产欧产美韩系列久久99| 国产精品久久久久77777丨| 日本久久黄色| 老司机精品久久| 美腿丝袜亚洲一区| 香蕉久久99| 青青国产精品| 韩国精品主播一区二区在线观看| 夜夜嗨网站十八久久 | 蜜臀va亚洲va欧美va天堂| 欧美一区自拍| 91精品亚洲| 日欧美一区二区| 国产成人精品亚洲线观看| 99视频精品视频高清免费| 亚洲精品中文字幕99999| 久久免费精品| 水蜜桃久久夜色精品一区的特点| 国产精品三p一区二区| 成人精品中文字幕| 日韩区一区二| 日本免费久久| 日韩1区2区3区| 亚洲a在线视频| 日本午夜免费一区二区| 青青久久av| 国产精品久久久久久久久免费高清| 丝袜av一区| 欧美激情福利| 怡红院精品视频在线观看极品| 国产精品一二| 久久国产66|