天天看點

js中的閉包及原型

js重點及難點

前言:

轉眼間,實習又一周過去了,這一周給我的感覺就是很累,但是收獲也是不少的,至少能與付出成正比。自己要學的東西還有很多的,在學校學的東西跟在公司學的還是有很大的差別的,而且從學校出來進入公司學習,在學習上的習慣要有改變,以前在學校學習都是以老師教課為主,自己再回去鞏固鞏固,而進入公司以後就不一樣了,自己要有自己的一套學習方法。在公司主要靠自己自學并且在實踐中去應用所學到的知識,是以要懂得一周下來去反思去總結這一周究竟學到了什麼,自己又掌握了多少。下面就是我這一周遇到比較棘手的問題:

  1. javascript閉包問題,下面是我個人的了解:

    首先什麼叫閉包?

    能夠通路其他函數作用域内變量的函數都叫閉包。舉個例子:

//函數A
   function A(){
        var a=;
        //函數B
        function B(){
        //在函數B裡面可以通路函數A裡的變量a
        console.log(a);
        }
    }
           

下面我們來分析一下為什麼?

1.當函數A定義時,A的作用域鍊中存放着目前環境下的變量,也就是GO(Global object)。

2.當函數A函數執行時會産生一個運作時上下文,此時A的作用域鍊的頂端會存放這個運作時上下文,也就是AO(運作時上下文),是以,GO就會頂端被擠到第二行。

3.這時候執行A的時候遇到了B函數的定義,B的作用鍊會直接拿到A的勞動成果。

4.當B函數執行時,B的作用域鍊頂端也會生成自己的運作時上下文,自然而然拿到的A函數的勞動成果隻能往下排,但是當B函數執行時通路變量的通路順序是自頂而下的,先從自己的執行期上下文裡找,找不到就順着A的AO裡找。。。是以當然就能通路到函數A的變量。

2.第二個問題也是比較難了解的javascript中的原型問題:

還是先解釋一下:當一個類定義時,它就有原型對象(prototype object),原型對象必須有多個内部特定屬性來表示類的特性。

/*這是一個構造函數,構造函數與一般函數形式一樣,隻是構造函數可以new一個對象
一般構造函數我們習慣用駝峰式命名*/
function Person(name,age){
    this.name=name;
    this.age=age;
}
//定義一個對象表示中國人
var Chinese={}
//将Person的原型指向chinese
Person.prototype=Chinese;
           

在建立類的執行個體時,該執行個體隐式包含有對自身原型對象的引用,是以執行個體中也包含有[Prototype]屬性。一個類的所有屬性都定義在原型對象上面,當類的執行個體通路一個屬性時,javascript解釋引擎就會去原型對象上查找屬性,然後執行。

例:

function GrandFather(){
   this.g1="";
   this.g2="";
}
function Father(){
   this.p3="";
   this.p4="";
}
function Child(){
   this.C5="";
}

Father.prototype=new GrandFather();
Child.prototype=new Father();
           

那麼在執行個體化GrandFather時,這個執行個體隐式包含有自身内部屬性[Prototype]的值,該值包含有GrandFather類屬性的描述;同樣在執行個體化Father時,這個執行個體隐式包含有自身内部屬性[Prototype]的值,該值包含有Father類屬性的描述;在執行個體化Child時,該執行個體包含有自身内部屬性[Prototype]的值,該值包含有Child類屬性的描述。

如果Child的執行個體調用一個屬性時,那麼就會按照下面的步驟:

(1)首先查找Child是否存在指定屬性,如果存在就執行,如果不存在就查找該執行個體包含的自身内部屬性[Prototype]的值,查到原型對象是Father執行個體,執行下一步。

(2)查到Father是否存在指定屬性,如果存在,就執行該屬性,如果不存在,就查找該執行個體包含的内部屬性[Prototype]的值,查到原型對象是GrandFather執行個體,執行下一步。

(3)查找GrandFather是否存在指定屬性,如果存在就執行,如果不存在,就查找該執行個體包含的内部屬性[Prototype]的值,查到原型對象是Object執行個體,執行下一步。

(4)查找Object是否存在該屬性,如果存在就執行,如果不存在,就會傳回undefined,因為Object就是原型鍊的盡頭。

因為方法就是類型為function的屬性,是以,這一過程,同樣适用于方法。

3.javascript中繼承的方法:

1⃣️原型鍊 
             2⃣️兩個構造函數同時使用一個原型 
             3⃣️聖杯模式(使用一個中間構造函數)
           

用的比較多的就是第三種實作方式。

上面就是遇到的比較難了解的點,除此之外這一周還複習了Java方面的内部類,集合架構以及線程并發等知識點。前端方面,自己也跟着官方文檔以網上視訊學習了bootstrap架構以及handlebars的模版,有了官方的幫助文檔,學起來還是比較簡單的,是以說隻要自己願意下功夫還是能學到很多東西的。接下來的時間裡,繼續加油吧!