1. 程式人生 > >物件和建構函式

物件和建構函式

.物件分類

            1.內建物件:

- 由ES標準中定義的物件,在任意ES的實現中都可以使用

              - 比如:Math String Number Boolean Function Object ...

2.宿主物件:

              - 由JS的執行環境提供的物件,目前來講主要指瀏覽器提供的物件

              - 比如:BOM DOM  (consol.log()  document.)

3.自定義物件:

              - 由開發人員自建立的物件         

二. 物件語法

            法一:

     建立物件: var obj=new Object();

     新增物件: 物件.屬性名=值;

         特殊:如果採用特殊屬性名(比如數字),需要使用另一種方式:

               物件

[“特殊屬性名”]=屬性值;

               且要怎麼新增,讀取就用什麼格式使用

     修改屬性: 跟新增物件一樣

     刪除屬性: delete 物件.屬性名;   

法二:

  Var obj={

   屬性名:屬性值,

   屬性名:屬性值,

   ...

   屬性名:屬性值   (沒有逗號了!!!)

}; 

三:判斷屬性是否在物件裡面(in):

     語法:“屬性名” in  obj;

     結果:如果在,返回true。 如果不在,返回false

              

物件深入

   一:工廠生產物件(用的不多):

         作用:就是生產物件快點,沒有新的知識,就只是單純函式和物件的結合使用

         思想:函式+物件

         步驟:建立一個傳參(傳物件的值些)函式

               在函式中new一個物件,如果讓物件中的值等於引數的值

               函式返回這個物件

                function creatPerson(name,age,sex){

                                     var obj=new Object();

                                     obj.name=name;

                                 obj.age=age;

                                 obj.sex=sex;

                                 return obj;

                              }

                                This

 

來歷:解析器在呼叫函式每次都會向函式內部傳遞一個隱形的引數,

      這個隱形的引數就是this,this指向一個對像

      這個物件我們稱為函式執行的上下文物件

代表什麼:根據函式的呼叫方式的不同,this會指向不同的物件(有4種)

  1. 以函式的形式呼叫時,this永遠都是window

  (因為使用函式,其實也是呼叫window的方法,this當然指向window,比如

 函式 fn,使用函式 fn()就等於 window.fn())

  1. 以方法的形式呼叫時,this就是呼叫方法的那個物件

   (其實第二種包括了第一種)

 

                           callapply

 

  1. 這倆個方法都是函式物件的方法,需要通過函式物件來呼叫

比如:function Fna,b{}

Fn.call(函式中this要指向的物件,函式引數1,引數2...

Fn.apply(函式中this要指向的物件,函式引數以陣列形式傳【引數1,引數2)

 

                            Agrument

 

          -在呼叫函式時,瀏覽器1每次都會傳遞倆個隱含的引數

          -1.執行的上下文物件 this

          -2封裝實參的物件 arguments

             解釋:

1.arguments是一個類陣列物件,他也可以通過索引來操作資料,也可以獲取長度

        2.在呼叫函式時,我們所傳遞的實參都會在arguments中儲存

        3.argumentsLength可以用來獲取實參的長度

        4.即使不定義形參,也可以通過arguments來使用形參

            只不過比較麻煩

            -arguments[0]  第一個實參

  

 

         5.裡邊有一個屬性叫做call

            這個屬性對應一個函式物件,就是當前正在指向的函式物件

 

 

 

 

                    

           二:建構函式(函式首字母必須大寫,這是對自己的規範!):

    1. 什麼是建構函式:

        - 建構函式和普通函式沒有區別,而區別就是呼叫方式的不同

        - 普通函式是直接呼叫,而建構函式需要使用new關鍵字來呼叫   

        - new物件,是從堆裡面給出空間,賦值給變數的只是堆裡面的地址,類似於指標

           

     2.建構函式的執行流程:

1.立刻建立一個新的物件

2.將新建的物件設定為函式中的this,在建構函式中可以使用this來引用新建的物件(建立的這個新物件,也就是this)

         3.逐行執行函式中的程式碼(比如alert(1)會立即執行)

         4.將新建的物件作為返回值返回

     3.使用instanceof可以檢查一個物件是否是一個類的例項

        語法:                               

             物件 instanceof 建構函式

             兒子            父親(或者跟高階的祖先,比如 Object)

             先有建構函式,就是一個類,然後才能例項化物件

       比如: var per=new Person("孫悟空",18,"");   

console.log(per instanceof Person);

         如果是,則返回true,否則返回false

    4.建構函式建立例項:

        function Person(name, age , gender){

                       this.name=name;  //this是不能少,因為沒有this,就不能給物件新增屬性,因為只有this才能指向當前建立的物件

                       this.age=age;

                       this.gender=gender;

                       this.sayName=function(){  //這裡為了

                            alert(this.name);

  }

}

var per=new Person("孫悟空",18,"");

 

 

    原型

     1.來源:我們所建立的每一個函式,解析器都會向函式中新增一個屬性prototype每個函式的原型都不一樣,但是一個建構函式,無論new多少個,它的原型都一樣,共享),這個屬性對應著一個物件,徵物件就是我們所謂的原型物件

      2.如果函式作為普通函式呼叫prototype沒有任何作用,且每一個原型都不一樣

      3.當函式通過建構函式呼叫時,它所建立的物件中都會有一個隱藏的屬性——也指向該建構函式的原型物件,我們可以通過__proto__來訪問該屬性(物件)。

      4.每個建構函式的原型物件都一樣(類似於公共區域)

      例如:建構函式原型: function fn(){};

                           var Fn=new fn();

                           Fn.__proto__ :這就是原型物件,是個物件哦,可以新增方法值哦

  1. 原型物件就相當於一個公共區域,所有同一個類都可以訪問這個原型物件,

   我們可以將物件中共有的內容,統一設定到原型物件中。

   

注:當我們訪問物件中的一個屬性或者方法時,它會先在物件自身中尋找,如果有則直接使用,如果沒有,則會到原型物件中尋找,如果找到就直接使用。

    1. 所以共有屬性,可以新增到原型物件中,因為可以不會影響到全域性作用域
    2. 原型也有原型