1. 程式人生 > >JS高級. 02 面向對象、創建對象、構造函數、自定義構造函數、原型

JS高級. 02 面向對象、創建對象、構造函數、自定義構造函數、原型

浪費 truct 創建過程 spa const 使用 指向 找到 tro

面向對象的三大特性:

  

  1. 封裝

    a) 把一些屬性和方法裝到一個對象裏

  2. 繼承

    a) js中的繼承是指:

    1.    一個對象沒有一些方法和屬性,而另一個對象有
    2.   把另一個個對象的屬性和方法,拿過來自己用,這就是繼承

    b) 混入式繼承 for … in

      1.   父類的屬性和方法在所有之類

  3. 多態

    a) JS中沒有相應的體現

    b) 在強類型語言比較常見

    c) 實用父類的變量接受子類的對象

    d) 父類的屬性方法供所有的子類共享

創建對象的方式

1. 創建對象

  四種方法:

    1、字面量創建

      用一個創建一個,不能復用。會造成代碼亢余,資源浪費

    2、內置構造函數創建對象

      1、內置構造函數創建對象

        1. var p = new Object();

        2.var arr = new Array();

        3. 創建出來的對象都是空對象,要手動添加屬性,造成代碼重復

    3、 封裝簡單的工廠函數(不推薦)

        

function    creatObj(name, age){
    var obj = {
            boj : name;
            obj: age;
            sayHello : function(){
                                    console.log(
‘‘); } } return obj; }

    4、 自定義構造函數

       

function Porple(data1,data2){
                this.xx = data;
        }

構造函數是幹什麽用的?

在JavaScript中,構造函數是給對象添加屬性,初始化屬性用的。

對象的創建過程

var p = new Person();

以上面這個p對象創建為例:

  1. 首先使用new關鍵字創建對象,類似於使用{},這個時候創建出來的對象是一個"沒有任何成員"的對象。這裏需要註意兩點:

    • 使用new關鍵字創建的對象,對象的類型就是創建這個對象使用的構造函數的函數名
    • 使用{}創建對象,對象的類型一定是Object,相當於使用了new Object()
  2. 使用構造函數為其初始化成員

    • 在構造函數調用開始的時候,有一個賦值操作,也就是讓this = 剛創建出來的對象
    • 在構造函數中,this就代表剛創建出來的對象
  3. 在構造函數中,利用對象的動態特性,為對象添加成員

自定義構造函數

function Porple(data1,data2){

this.xx = data;

}

  1. 概念:用來實例化對象,並且給初始化對象賦值
  2. 構造函數名首字母大寫
  3. 構造函數一般和new關鍵字一起使用
  4. 構造函數返回值默認為新創建好的對象,如果手動設置返回值

a) 返回值類型如果不是Object類型的都還返回創建的對象

b) 如果是Object類型的就返回object

a) 對象字面量{},創建對象

b) 自定義構造函數,創建對象

  1. 構造函數也是函數,通常用來初始化對象
  2. new用來創建對象
  3. 構造函數用來初始化函數
  4. 構造函數名要大寫,

c) 構造函數的執行過程

  1. 使用new關鍵字創建對象
  2. 調用構造函數把新創建出來的對象賦值給構造函數的this關鍵字
  3. 在構造函數內實用this為新創建出來的對象添加成員
  4. 默認返回新創建的這個對象
  5. 如果return一個空值,或者return一個基本類型數據仍舊是返回新創建的對象

a) 返回undefined和null都是返回新對象

  1. 如果return的是object類型,將返回return後面的對象
  2. 函數名加括號就是調用函數
  3. 不寫括號是把函數整體代碼賦值給另一個變量
  4. 如果調用函數的時候不給構造函數實參,構造函數不會創建新對象,裏面的this將會指向window,添加的屬性也會添加給window
  5. 如果構造函數沒有參數,可以不寫括號調用

對象成員:屬性和方法

原型、

  • 每一個函數在定義的時候,都會有跟它關聯的一個對象被創建出來
  • 每一個由構造函數創建出來的對象,都會默認的和構造函數的神秘對象關聯
  • 當使用一個方法進行屬性或者方法訪問的時候,會先在當前對象內查找該屬性和方法
  • 如果當前對象內未找到,就回去跟它關聯的神秘對象內進行查找

  1. 訪問構造函數的原型

    a) 構造函數.prototype

  2. 構造函數.prototype.新屬性 = 屬性值

  3. 自己和原型中都有的屬性,優先用自己的

  3. 創建一個對象叫做實例化對象

    a) 通過構造函數創建對象創建對象的過程

  4. 實例

    a) 通過構造函數實例化出來的對象就是該構造函數的一個實例

  5. 原型的實用方法:

    a) 利用對象的動態特性給原型對象添加屬性

  6. 直接替換原型對象

    Porple.prototype = {

     name : ‘Jack’,

    }

    a) 直接替換原型對象出現的問題

    1. 在替換原型之前創建的對象的原型 和在替換原型之後創建的對象的原型 不是同一個
    2. 替換不是修改

    b) 點語法進行屬性賦值的時候,不會去原型查找

    c) 使用點語法賦值的時候,如果對象中不存在該屬性,就會對該對象新增屬性,不會去原型中查找

    d) 如果原型總分的屬性是引用類型的屬性,那麽所有的對象共享該屬性,並且一個對象修改了該引用

      類型中的成員,所有對象都會被修改

    e) 一般不會把屬性放置到原型中

  7. 通過構造函數訪問原型

    a) 構造函數.prototype

  8. 通過對象訪問原型

    a) 對象.__proto__ //不推薦使用

  9. constructor:原型對象的屬性

JS高級. 02 面向對象、創建對象、構造函數、自定義構造函數、原型