javascript閉包和繼承

一、閉包:

1、概念

通過作用域的嵌套,將原本的局部變量渡讼,進(jìn)化成私有變量(自由變量)的環(huán)境
通俗理解的閉包: 一個內(nèi)部函數(shù)引用了外部函數(shù)的變量,外部函數(shù)形成了一個閉包.

function fun1(){
    var n=999;
    function fn2(){
        console.log(n);
    }
    return fn2; //fn2 就是一個閉包函數(shù),因?yàn)樗軌蛟L問到fun1函數(shù)的作用域
}
var r=fun1();
r();

2耳璧、原理

函數(shù)在執(zhí)行時成箫,可以拿到自身的定義作用域內(nèi)的變量
觸發(fā)了垃圾回收機(jī)制
將暫時不用的數(shù)據(jù),暫存起來旨枯,如果需要使用蹬昌,可以再次調(diào)出,除非真正不用了攀隔,再進(jìn)行刪除

3皂贩、特點(diǎn)

  • 設(shè)置私有變量(內(nèi)部函數(shù)調(diào)用外部函數(shù)的局部變量,這個局部變量就會變成內(nèi)部函數(shù)的私有變
    量)

  • 閉包的作用:充當(dāng)一個攝像頭,函數(shù)外部可以訪問函數(shù)內(nèi)部的變量,減少變量的聲明,避免造成污染.

  • 使用不當(dāng)會很容易造成內(nèi)存泄露(內(nèi)存中能存的東西越來越少,像是其他部分被泄露了一樣)

  • 內(nèi)存的占用比較大,浪費(fèi)內(nèi)存.

4昆汹、應(yīng)用場景

 // - 事件委托的封裝
        function eveEnt(child, cb){
            return function(eve){
                var e = eve || window.event;
                var tar = e.target || e.srcElement;
                for(var i=0;i<child.length;i++){
                    if(tar === child[i]){
                        cb.call(tar);
                    }
                }
            }
        }
   // - 循環(huán)綁定事件明刷,事件中使用循環(huán)的計(jì)數(shù)器
        for(var i=0;i<ali.length;i++){
            (function(index){
                ali[index].onclick = function(){
                    console.log(index);
                }
            })(i)
        }

        for(var i=0;i<ali.length;i++){
            ali[i].onclick = (function(index){
                return function(){
                    console.log(index);
                }
            })(i)
        }
     
    //- 內(nèi)置函數(shù)的回調(diào)函數(shù)傳參
       
        setTimeout(fn("hello"),1000);
        function fn(a){
            return function(){
                console.log(a);
            }
        }

二、繼承

1满粗、 改變 this 指向的繼承

function Parent(){
        this.skill = "敲代碼";
        this.abc = 123;
        this.show = function(){
            console.log(this.skill)
        }
    }
    Parent.prototype.init = function(){
        console.log("hello")
    }

    function Tea1(){
        this.s1 = "語文";
    }
    function Tea2(){
        this.s2 = "數(shù)學(xué)";
    }
    function Tea3(){
        this.s3 = "英語";
    }

    function Child(){
        // Parent();       // this指向window
        // 改變成將來Child的實(shí)例
        // 在Child的函數(shù)中的this辈末,就是將來Child的實(shí)例
        // 將Parent的this改成Child的this
        Parent.call(this);
        Tea1.apply(this);
        Tea2.bind(this)();
        Tea3.call(this);
    }

    // var p = new Parent();
    // console.log(p);
    // console.log(p.skill);

    var c = new Child();
    console.log(c)
    console.log(c.skill)
    c.show();
    c.init();

 改變this指向繼承:
    對象之間的繼承
    類與類之間
 特點(diǎn)
    簡單方便易操作,可以實(shí)現(xiàn)多繼承
    只能繼承構(gòu)造函數(shù)中的內(nèi)容,不能繼承原型上的內(nèi)容

2挤聘、 原型繼承

function Parent(){
        this.skill = "敲代碼";
    }
    Parent.prototype.init = function(){
        console.log("hello");
    }

    function Child(){
    }
    // Child.prototype = Parent.prototype;
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i];
    }

    // Child.prototype.init = function(){
    //     console.log("world")
    // }

    var p = new Parent();
    p.init()
    console.log(p)

    var c = new Child();
    c.init();
    console.log(c)

// - 可以繼承原型上所有內(nèi)容轰枝,但是不能繼承構(gòu)造函數(shù)

3、原型鏈繼承

 function Parent(s){
        this.skill = s;
    }
    Parent.prototype.init = function(){
        console.log(this.skill);
    }

    function Child(){
    }
    
    Child.prototype = new Parent("hello");

    // Child.prototype.init = function(){
    //     console.log("world")
    // }

    var p = new Parent("敲代碼");
    p.init()
    console.log(p)

    var c1 = new Child();
    c1.init();
    console.log(c1)

    var c2 = new Child();
    c2.init();
    console.log(c2);

    // 原型繼承-原型鏈繼承:
        // 可以繼承原型组去,可以繼承構(gòu)造函數(shù)
        // 不利于傳參

4狸膏、混合繼承

function Parent(s){
        this.skill = s;
    }
    Parent.prototype.init = function(){
        console.log(this.skill);
    }

    function Tea1(){
        this.s1 = "語文"
    }
    Tea1.prototype.show = function(){
        console.log(this.s1);
    }

    function Child(s){
        Parent.call(this, s);
        Tea1.call(this);
    }
    
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i];
    }
    for(var i in Tea1.prototype){
        Child.prototype[i] = Tea1.prototype[i];
    }

    // Child.prototype.init = function(){
    //     console.log("world")
    // }

    var p = new Parent("敲代碼");
    p.init()
    console.log(p)
    // p.show()

    var c1 = new Child("敲鍵盤");
    c1.init();
    console.log(c1)
    c1.show();

    // 混合繼承特點(diǎn):
        // 可以繼承構(gòu)造函數(shù),可以繼承原型添怔,還可以實(shí)現(xiàn)多繼承

5、class 繼承

class Parent{
        constructor(s){
            this.skill = s;
        }
        init(){
            console.log(this.skill)
        }
    }

    class Child extends Parent{
        constructor(s){
            super(s);
        }
        init(){
            console.log("hello")
        }
    }

    var p = new Parent("敲代碼");
    p.init();
    console.log(p);

    var c = new Child("敲鍵盤");
    c.init();
    console.log(c);


 - ES6對混合繼承的封裝

6贤旷、Object.create() Array.from() 方法

var obj = {
        name:"admin"
    }

    var obj2 = Object.create(obj);
 // console.log(obj2 === obj);      // f

var arr1 = [1,2,3]
    var arr2 = Array.from(arr1);
    console.log(arr1 === arr2);  //f
    
 // 偽數(shù)組:有索引广料,有長度,但是不能使用數(shù)組的方法
        // arguments
        // 選擇器選擇到的數(shù)組

    var aspan = document.querySelectorAll("span");
    // 偽轉(zhuǎn)真
    // 1.逐個遍歷幼驶,拷貝到新數(shù)組
    // var arr = [];
    // for(var i=0;i<aspan.length;i++){
    //     arr.push(aspan[i])
    // }
    // arr.push("hello")
    // console.log(arr)
    // 2.利用Array的方法from
    var arr = Array.from(aspan);
    arr.push("world");
    console.log(arr);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾杏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盅藻,更是在濱河造成了極大的恐慌购桑,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氏淑,死亡現(xiàn)場離奇詭異勃蜘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)假残,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門缭贡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辉懒,你說我怎么就攤上這事阳惹。” “怎么了眶俩?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵莹汤,是天一觀的道長。 經(jīng)常有香客問我颠印,道長纲岭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任嗽仪,我火速辦了婚禮荒勇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闻坚。我一直安慰自己沽翔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仅偎,像睡著了一般跨蟹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橘沥,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天窗轩,我揣著相機(jī)與錄音,去河邊找鬼座咆。 笑死痢艺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的介陶。 我是一名探鬼主播堤舒,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哺呜!你這毒婦竟也來了舌缤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤某残,失蹤者是張志新(化名)和其女友劉穎国撵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玻墅,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡介牙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椭豫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耻瑟。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赏酥,靈堂內(nèi)的尸體忽然破棺而出喳整,到底是詐尸還是另有隱情,我是刑警寧澤裸扶,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布框都,位于F島的核電站,受9級特大地震影響呵晨,放射性物質(zhì)發(fā)生泄漏魏保。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一摸屠、第九天 我趴在偏房一處隱蔽的房頂上張望谓罗。 院中可真熱鬧,春花似錦季二、人聲如沸檩咱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻蚯。三九已至绊含,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炊汹,已是汗流浹背躬充。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讨便,地道東北人充甚。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像霸褒,于是被迫代替她去往敵國和親津坑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 閉包 函數(shù)對象可以通過作用域鏈相互關(guān)聯(lián)眉反,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)昙啄,這種特性稱之為“閉包”。當(dāng)一個函...
    愛癡魚閱讀 443評論 0 0
  • 閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合 ? 一個擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個函數(shù))寸五,...
    郭豪豪閱讀 358評論 0 0
  • 網(wǎng)上關(guān)于閉包的文章很多梳凛,各種專業(yè)文獻(xiàn)上的“閉包”定義非常抽象,很難看懂梳杏。官方對閉包的解釋是:一個擁有許多變量和綁定...
    凌晨的海鷗閱讀 318評論 0 1
  • title: 原型鏈韧拒、閉包與繼承tags:- javaScript- 原型鏈與閉包的深入理解categories:...
    永不褪色的夢_af69閱讀 363評論 0 0
  • 理解閉包,你首先必須理解JS的變量作用域十性,JavaScript作用域和作用域鏈叛溢。 ES6之前,變量的作用域分為全局...
    卓三陽閱讀 704評論 0 1