js高程筆記6-7章

第6章數組

1.ES有兩種屬性:數據屬性和訪問器屬性。屬性中包含各類特性,表示屬性的各類特徵。閉包

數據屬性:[[Configurable]],[[Enumerable]],[[Writable]],[[Value]]函數

  修改屬性使用方法:Object.defineProperty()this

訪問器屬性:[[Configurable]],[[Enumerable]],[[Get]],[[Set]]spa

  訪問器屬性不包含數值。只能經過Object.defineProperty()定義。經過設置set和get函數,分別設置讀取和寫入的時候的行爲。P141prototype

2.屬性的特性的其餘方法:指針

Object.defineProperties()設置多個屬性和其特性code

Object.getOwnPropertyDescriptor()讀取屬性的特性對象

3.建立對象的模式:blog

4.工廠模式:解決了重複代碼問題,但沒法識別對象類型

5.構造函數模式:可以識別對象類型,但每一個方法都要在實例上從新建立一遍。不一樣實例上的同名函數不等。

  一個函數經過new來調用就是構造函數,直接調用就是普通函數。

6.原型模式:沒必要在構造函數中定義對象實例的信息,而是將這些信息直接添加到原型對象中,讓全部對象實例共享它包含的屬性和方法。

  原型對象:(1)建立新函數時,同時建立函數的prototype屬性,指向該函數的原型對象。

       (2)原型對象生成一個constructor屬性,指向原型所在函數。

       (3)調用構造函數建立新實例,實例內部包含一個指針[[prototype]],指向原型對象

  原型對象的方法:Object.prototype.isPrototypeOf(實例) 肯定某原型是否爲某實例的原型。

          Object.getPrototypeOf(實例) 返回某個實例原型對象

          實例.hasOwnProperty(屬性) 當某屬性存在於某實例中時,返回true

          in操做符:屬性 in 對象,該對象存在某屬性時返回true

          Objet.key(實例or原型) 遍歷實例或者原型裏能夠枚舉的屬性名,返回一個字符串數組

          Object.getOwnPropertyNames(實例或原型) 遍歷實例或者原型裏的全部屬性名,不論是否可枚舉,返回一個字符串數組

  若是在調用構造函數建立一個實例後,重寫原型對象,那麼實例的[[prototype]]沒法指向新的原型對象。P156

  原型模式弊端:全部實例擁有相同屬性值,因爲共享,實例1的修改會在實例2中體現出來

7.組合使用構造函數模式和原型模式:將屬性定義在構造函數中,原型定義方法和須要共享的屬性

8.動態原型模式:當方法不存在時,就在原型建立方法

9.寄生構造函數模式:在構造函數中建立新對象,再返回該對象。

  構造函數在不返回值的時候,默認會返回新對象實例。經過在構造函數的末尾添加一個return,能夠重寫調用構造函數返回的值。

10.穩妥構造函數模式:避免使用this和new,某些屬性值只有經過惟一的方法才能訪問。

 


 

繼承方法:

11.原型鏈:讓原型對象等於另外一類型的實例。

  假設另外一類型使用原型模式,做爲實例,它繼承了另外一類型的全部屬性。內部有個[[prototype]]指針指向另外一類型的原型對象。做爲原型對象,它擁有本類型的方法,它的 constructor屬性指向另外一類型。

  全部函數的默認原型都是Object的實例,因此另外一類型做爲Object的實例,有[[prototype]]指針指向Object的原型對象。

  必須在實現繼承後再增長原型的方法。不然,方法只會存在於原來默認的原型對象中

  原型鏈弊端:原型對象做爲另外一類型的實例,繼承了另外一類型的實例屬性。則,該實例屬性在本類型的全部實例中,成了共享的原型屬性。本類型的實例1對該屬性的修改會在實例2體現出來。

        同時,建立子類型的實例時,不能向超類型的構造函數傳遞參數。

12.借用構造函數:在子類型構造函數內部使用call()調用超類型構造函數,能夠避免子類型繼承的屬性被共享,同時能夠向超類型傳參。

  弊端:方法在構造函數定義,沒法複用。

13.組合繼承:使用原型鏈實現對原型屬性和方法的繼承,經過借用構造函數來實現對實例屬性的繼承。

  子類型借用超類型的構造函數,至關因而在子類型上建立了同名的實例屬性,從而屏蔽了子類型的原型對象上那個繼承而來的屬性,避免了屬性被共享。

  弊端:會兩次調用超類型。一次在建立子類型原型的時候,一次在建立子類型實例時,調用了超類型構造函數爲子類型建立屬性

14.原型式繼承:將已有的對象a做爲新建對象b的原型,則b的實例共享a的屬性和方法。至關於對a執行了一次淺複製。現有方法:Object.create()

15.寄生式繼承:建立一個僅用於封裝繼承過程的函數,其中方法沒法複用。

16.寄生組合式繼承:爲了不組合繼承中兩次調用超類型構造函數形成的子類型實例和原型中存在同名的屬性,可使用借用構造函數來繼承屬性,經過原型鏈的混成形式來繼承方法。

  使用寄生式繼承來繼承超類型的原型,再將結果指定給子類型的原型。將此替換組合類型中爲子類型原型賦值的語句。

 

第7章 函數表達式

1.在使用遞歸的時候,在函數內部使用arguments.callee來調用本身。

2.閉包:有權訪問另外一個函數做用域中的變量的函數。

  建立方式:在一個函數內部建立另外一個函數,並返回。

  外部函數在執行完畢後,其執行環境的做用域鏈會被銷燬,但其活動對象不會被銷燬,由於內部匿名函數的做用域鏈仍然在引用這個活動對象。直到內部匿名函數被銷燬後,外部函數的活動對象才被銷燬。

3.閉包保存的是整個變量對象,而不是某個特殊的變量,所以閉包只能取得包含函數中任何變量的最後一個值。

4.匿名函數的執行環境具備全局性,所以this對象一般指向window。閉包中搜索this和arguments這兩個變量時,只會搜索到其活動對象,並不會沿着做用域鏈訪問外部函數的this和arguments。

5.模仿塊級做用域:

1 (function(){
2     //這裏是塊級做用域
3 })();

將函數聲明包含在一對圓括號中表示它是一個函數表達式。緊跟着另外一對圓括號表示當即調用這個函數。

6.特權方法:有權訪問私有變量和私有函數的公有方法。

  (1)在構造函數中定義特權方法(在構造函數中將特權方法定義爲構造函數的方法,經過對象實例來訪問)。弊端:必須使用構造函數模式。

  (2)在私有做用域中定義私有變量和函數。在原型上定義了公有方法(在原型對象中將特權方法定義爲方法。),體現了原型模式,增長了代碼複用。弊端:每一個實例都沒有本身的私有變量。P188

7.模塊模式:爲單例(只有一個實例的對象)建立私有變量和特權方法(將特權方法定義在函數返回的對象字面量中)。

8.加強的模塊模式:將返回的對象字面量換成某種類型的實例。用於規定單例是某種類型的實例的狀況。

相關文章
相關標籤/搜索