建立對象及原型的使用

1.面向對象的三大特性

  • 封裝
  • 繼承
    本身沒有的,拿別人過來用,就是繼承
  • 多態
    父類引用指向子類的對象(JavaScript中用不到)

2.建立對象的四種方式

  • 使用字面量建立對象函數

    var o = {key:value, key:value...}

    用一個建立一個,不能複用,形成代碼冗餘,資源浪費this

  • 使用內置構造函數建立對象prototype

    var o = new Object();
       var o = new Array();

    建立出來的對象都是空的對象,要手動的去爲對象添加屬性。形成代碼重複調試

  • 封裝簡單的工廠函數(不推薦使用)code

    function createObj(){
         var obj = {};
         obj.xx=xxx;
         return obj;
    }
  • 自定義構造函數
function 構造函數名{
    this.xxx=xxx;
    //....
}

1.構造函數名首字母要大寫
2.構造函數通常和new關鍵字一塊兒使用
3.構造函數返回值默認爲新建立好對象 若是手動返回基本數據類型,不影響默認返回值,若是返回的是對象,那麼新建立出來的對象將不會返回,取而代之的是return後面的對象對象

構造函數(constructor)的執行步驟
1.使用new關鍵字建立對象
2.調用構造函數,將new建立出來的對象賦值給構造函數內的this
3.使用this給新建立出來的對象增長成員
4.默認返回新建立出來的這個對象繼承

原型

構造函數存在問題

構造函數中的方法,每新建立一個對象的時候,該對象都會從新的建立一次這個方法,每一個獨享獨佔一個方法
可是該方法內容徹底相同,因此形成資源浪費ip

1.解決辦法1
將構造函數內的方法,進行提取,放在構造函數外面,在構造函數內部進行引用賦值
那麼建立出來的對象,都會指向構造函數外面的這個函數,達到共享的目的
問題:全局變量增多,形成全局變量污染,代碼結構混亂,不容易維護資源

2.解決辦法2
使用原型原型

3.原型

原型是什麼?

在構造函數建立出來的時候,系統會默認的建立並關聯一個對象,這個對象就是原型,原型對象默認是空對象
默認的原型對象中會有一個屬性constructor指向該構造函數

原型的做用

原型對象中的成員,能夠被使用和它關聯的構造函數建立出來的全部對象共享

原型對象的使用

  1. 使用對象的動態特性,爲原型對象添加成員
  2. 直接替換原型對象

注意事項:

直接替換原型對象,會致使替換以前建立的對象的原型和替換以後建立的對象的原型不一致

原型的使用該注意事項

1.使用對象訪問屬性的時候,會如今對象中查找,若是找到了就直接使用
若是沒有找到,就去原型中查找
2.使用對象設置屬性的時候,只會在對象自己中查找,不會去原型中查找,若是在對象自己中沒有找到這個屬性
則給該對象新增一個屬性,若是在對象中有這個屬性,修改這個屬性
3.若是在原型對象中有引用類型的屬性,那麼使用對象進行修改該屬性內容,則其餘全部跟這個原型對象相關的對象都會受到影響

Person.prototype.car = {};
var p = new Person( );
p.car = {}; //這是修改屬性
p.car.brand= ""; //這是修改屬性的內容

4.通常狀況下不會將屬性添加到原型對象中
只會將須要共享的方法,添加到原型對象中

proto

1.這個屬性不是標準屬性,因此存在通用性問題
2.通常不推薦使用這個屬性
3.調試的時候,可使用這個屬性
4.這個屬性是原型中的屬性

替換原型時候的注意事項:在新替換的原型中,沒有constructor屬性,會影響三角結構關係的合理性so,在新替換的原型中,手動添加constructor屬性,以保證關係的合理性,賦值爲關聯的構造函數

相關文章
相關標籤/搜索