亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JS繼承與閉包及JS實現繼承的三種方式

2019-11-19 15:10:06
字體:
來源:轉載
供稿:網友

前  言

在之前的兩篇博客中,我們詳細探討了JavaScript OOP中的各種知識點(JS OOP基礎與JS 中This指向詳解 、 成員屬性、靜態屬性、原型屬性與JS原型鏈)。今天我們來繼續探討剩余的內容吧。

我們都知道,面向對象的三大特征――封裝、繼承、多態。 封裝無非就是屬性和方法的私有化,所以我們JS中提供了私有屬性和私有方法。 而JS中并沒有多態,因此我們說JS是一門基于對象的語言,而非面向對象的語言。 那么,面向對象三大特征中,在JS中最重要的就是繼承了。

一、繼承的基本概念

使用一個子類繼承另一個父類,子類可以自動擁有父類的屬性和方法。

>>>繼承的兩方,發生在兩個類之間。

所以,所謂的繼承,無非就是讓子類,擁有父類的所有屬性和方法。那么,在JS中,我們要模擬實現這一步,有三種常用的方法可以實現。

分別是:擴展Object的prototype實現繼承、使用call和apply實現繼承、使用原型實現繼承。

二、擴展Object的prototype實現繼承

擴展Object實現繼承的本質,是我們自己寫了一個方法,將父類的所有屬性和方法通過遍歷循環,逐個復制給子類。

詳細步驟如下:

1:定義父類

functionParent(){}

2:定義子類

funtion Son(){}

3:通過原型給Object對象添加一個擴展方法。

Object.prototype.customExtend =function(parObj){for(variinparObj){//通過for-in循環,把父類的所有屬性方法,賦值給自己this[i] =parObj[i];}}

4:子類對象調用擴展方法

Son.customExtend(Parent);

三、使用call和apply實現繼承

首先,要使用這種方式顯示繼承,我們再來回顧一下call和apply兩個函數的作用:

call和apply:通過函數名調用方法,強行將函數中的this指向某個對象;

call寫法:func.call(func的this指向的obj,參數1,參數2...);

apply寫法:func.apply(func的this指向的obj,[參數1,參數2...]);

那么,我們使用這兩個函數實現繼承的思路就是:在子類中,使用父類函數調用call或apply,并將父類的this,強行綁定為子類的this。 那這樣,父類綁定在this上的屬性和方法,不就順利成章的綁定到子類的this上了嗎?

詳細步驟如下:

1:定義父類

funtion Parent(){}

2:定義子類

functionSon(){}

3:在子類中通過call方法或者apply方法去調用父類。

functionSon(){Parent.call(this,....);//將父類函數中的this,強行綁定為子類的this}

四、使用原型實現繼承

使用原型實現繼承,是比較簡單而且比較好理解的一種,就是將子類的prototype指向父類的對象就可以啦。

詳細步驟如下:

1:定義父類

functionParent(){}

2:定義子類

functionSon(){}

3:把在子類對象的原型對象聲明為父類的實例。

Son.prototype =newParent();

五、閉包

要理解閉包,首先,我們要了解一下JS中的作用域:

1、JS中的作用域

全局變量:函數外聲明的變量

局部變量:函數內聲明的變量

在JS中,函數為唯一的局部作用域,而if、for等其他{}沒有自己的作用域

所以,函數外不能訪問局部變量。其實,變量在函數執行完畢以后,占用的內存就會被釋放。

2、閉包

在概述中,我剛剛提到,面向對象的三大特征中的“封裝”,我們可以用函數的私有屬性來實現。這個私有屬性,其實也就是局部變量。

但是我們都知道,封裝是限制外部的訪問,并不是直接拒絕外部的訪問,那么我們在函數中私有的屬性,怎么才能在外部訪問呢?答案就是閉包!

JS中,提供了一種"閉包"的概念:在函數內部,定義一個子函數,可以用子函數訪問父函數的私有變量。執行完操作以后,將子函數通過return返回。

代碼示例:

functionfunc2(){varnum = 1;functionfunc3(){varsum = num+10;alert(sum);}returnfunc3;}varf =func2();f();

3、閉包的作用:

① 訪問函數的私有變量;

② 讓函數的變量始終存在于內存中,而不被釋放。

4、閉包的典型應用

我們來做這樣一個功能:頁面中有6個li,要求實現點擊每個li,彈出這個li對應的序號。

HTML代碼很簡單:

那JS代碼呢?我覺得很大一部分同學會這樣寫:

varlis = document.getElementsByTagName("li");for(vari=0;ilis[i].onclick=function(){alert("您/點擊了第"+i+"個li!");}

那么,這樣對嗎?不對?。?!我們來分析一下:頁面加載的時候,JS代碼會全部執行,也就是上面的for循環在頁面加載完就已經執行完了!那,這個i就已經變成了lis.length。也就是說,你在點擊li的時候,無論點擊第幾個,彈出的都是lis.length。

那么,我們應該怎么修改呢?看代碼!

varlis = document.getElementsByTagName("li");for(vari=0;ilis[j].onclick=function(){alert("您/點擊了第"+j+"個li!");}}();}

區別在哪?明眼人一眼就看穿我們在for循環外面嵌套了一層自執行函數!這種函數套函數的形式,就形成了閉包!

那作用呢?我們剛才強調,閉包的自執行函數會有自己的作用域。在函數里面的代碼沒有執行的時候,自執行函數中的j是不會被釋放掉的!

也就是說,循環轉了6次!生成了6個獨立的函數空間,每個空間中有自己獨立的j變量,所以最終不會出現所有li點擊都是lis.length的情況!

總結

以上所述是小編給大家介紹的JS繼承與閉包及JS實現繼承的三種方式,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人九九综合九九宗合| 亚洲欧美国产精品久久久久久久| 午夜精品一区二区三区视频免费看| 国产精品一区二区久久久久| 欧美激情精品久久久久久变态| 国产亚洲欧美一区| 久久久电影免费观看完整版| 久色乳综合思思在线视频| 国产精品老牛影院在线观看| 热久久免费国产视频| 精品露脸国产偷人在视频| 福利精品视频在线| 久久69精品久久久久久国产越南| 亚洲国产成人精品一区二区| 视频在线观看一区二区| 欧美在线视频一二三| 国产成人精品视频在线观看| 国产91精品最新在线播放| 亚洲精品小视频| 国产精品视频最多的网站| 欧美激情视频免费观看| 国产亚洲欧美日韩美女| 91精品在线影院| 精品视频中文字幕| 国产欧美一区二区三区久久| 性欧美xxxx视频在线观看| 日韩av影院在线观看| 国内精品视频久久| 亚洲第一综合天堂另类专| 色噜噜狠狠狠综合曰曰曰88av| 亚洲色图激情小说| 欧美裸身视频免费观看| 久久综合色影院| 亚洲欧美激情视频| 隔壁老王国产在线精品| 亚洲色图18p| 久久久久北条麻妃免费看| 亚洲精品久久久久国产| 国产999精品久久久影片官网| 国产日韩在线观看av| 在线观看亚洲视频| 国产欧美一区二区三区在线看| 国产欧美日韩免费看aⅴ视频| 97视频在线观看免费高清完整版在线观看| 久久精品99无色码中文字幕| 久久精品视频一| 久久亚洲精品中文字幕冲田杏梨| 日韩成人av在线| 欧美一级免费看| 国产一区二区三区在线免费观看| 国产91精品黑色丝袜高跟鞋| 国产亚洲福利一区| 成人国产亚洲精品a区天堂华泰| 国产精品久久久久久一区二区| 久久国产精品影片| 亚洲第一黄色网| 在线亚洲男人天堂| 亚洲老板91色精品久久| 国产精品久久久久久久app| 九九热99久久久国产盗摄| 亚洲国产精品久久久久| 欧美成人在线影院| 久久精品国产91精品亚洲| 欧美一级高清免费播放| 中文国产成人精品| 欧美日韩国产中文精品字幕自在自线| 久久久国产精品视频| 国产日产久久高清欧美一区| 91亚洲精品视频| 亚洲国产成人久久综合一区| 国产成人精品视频在线| 欧美劲爆第一页| 国产午夜精品久久久| 国产精品麻豆va在线播放| 成人免费高清完整版在线观看| 精品久久香蕉国产线看观看亚洲| 国产精品美女www爽爽爽视频| 中文字幕欧美日韩精品| 国产精品久久999| 亚洲电影免费观看高清| 精品欧美国产一区二区三区| 日本一区二三区好的精华液| 欧美久久精品一级黑人c片| 日韩在线观看免费高清完整版| 日韩精品亚洲视频| 亚洲国产精品网站| 国产精品一区二区三区成人| 亚洲精品久久久久中文字幕欢迎你| 岛国av在线不卡| 国产精品成人va在线观看| 久久久精品2019中文字幕神马| 国产精品入口免费视| 亚洲视频精品在线| 97国产精品视频人人做人人爱| 亚洲电影av在线| 久久国产精品99国产精| 中文字幕亚洲一区二区三区五十路| 日韩69视频在线观看| 国产精品爱啪在线线免费观看| 成人免费淫片视频软件| 91av成人在线| 亚洲xxxx妇黄裸体| 国产精品美女呻吟| 九九热r在线视频精品| 777精品视频| 亚洲精品网址在线观看| 68精品久久久久久欧美| 国产乱人伦真实精品视频| 亚洲第一免费播放区| 日韩精品中文字幕在线| 538国产精品一区二区免费视频| 一区二区三区视频免费在线观看| 在线播放国产精品| 国产一区二区三区在线播放免费观看| 久久人人爽人人爽人人片av高请| 日韩精品视频三区| 国产精品专区h在线观看| 国产精品久久久999| 亚洲天堂av高清| 国产精品高精视频免费| 538国产精品视频一区二区| 成人有码在线播放| 国内精品视频久久| 欧美一区二三区| 日韩少妇与小伙激情| 国产中文字幕亚洲| 国产视频福利一区| 欧美激情精品久久久久久变态| 一区二区三区回区在观看免费视频| 国产成人精品免高潮费视频| 久久久亚洲影院你懂的| 国产福利视频一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲最大的成人网| 不卡毛片在线看| 亚洲福利在线看| 日韩精品视频在线播放| 91精品国产一区| 国产午夜精品美女视频明星a级| 国产精品美女主播在线观看纯欲| 伊人青青综合网站| 亚洲国产小视频| 欧美成人免费全部观看天天性色| 日本精品视频在线观看| 亚洲欧美一区二区三区四区| 日韩中文字幕久久| 国语自产精品视频在线看抢先版图片| 亚洲国产精品美女| 成人激情综合网| 国产一区二区三区网站| 少妇高潮久久77777| 伊人伊成久久人综合网小说| 欧美激情亚洲综合一区| 色婷婷久久av| 亚洲在线免费观看| 欧美乱大交xxxxx另类电影| 九色精品美女在线| 2019中文字幕在线| 91精品国产91久久久| 日韩欧美在线视频观看| 国产成人一区二区三区电影| 久久不射电影网| 亚洲跨种族黑人xxx| 精品福利樱桃av导航|