總結-定義物件進階&Object&hasOwnProperty()&create()&call、apply、bind函式&繼承&靜態屬性&私有屬性&this指向
阿新 • • 發佈:2019-02-10
定義物件進階&Object&hasOwnProperty()&create()&call、apply、bind函式&繼承&靜態屬性&私有屬性&this指向 定義物件進階 1.建構函式方式 這種方式定義的物件會佔用很多記憶體,因為每個物件建立單獨的空間,儲存各自的內容 2.原型物件方式 缺點:當改變一個物件的引用型別的屬性後,其他物件也發生了變化 3.混合方式定義 混合是指建構函式方式和原型物件方式混合,將屬性放到建構函式內部,將成員方法放到原型物件中。 節省記憶體,而且又能將函式區分開 4.動態混合方式 類似於單例模式的寫法 Object Object是JS內建的一個建構函式 Object函式也有原型物件 所有自定義物件,它的原型物件都是Object物件。所以自定義物件可以使用Object函式中的成員,也可以使用Object原型物件上的成員 hasOwnProperty() hasOwnProperty方法是Object函式的原型物件上的方法。 hasOwnProperty方法用於檢測例項物件是否有非繼承的屬性,也就是自身有該屬性。 create() create()方法是Obejct建構函式內的成員方法,而且是一個靜態方法(呼叫方式是直接使用Object來呼叫)。 create()方法用於建立物件,建立物件的時候,可以指定物件的原型物件。 var o = Object.create({原型物件}, {o物件的內容}); var o = Object.create({父物件}, {子物件o本身}); call、apply、bind函式 這三個函式都可以改變函式內部this的指向 函式.call(希望this指向的物件,引數1, 引數2…); 呼叫之後,會直接執行函式 函式.apply(希望this指向的物件,[引數1, 引數2…]); 呼叫之後,會直接執行函式 函式.bind(希望this指向的物件,引數1, 引數2…); 呼叫之後,不會執行函式。 繼承 冒充繼承 父類.call(子類的物件, 其他引數); //意思是讓子類的物件,去代替父類中的this。 原型鏈繼承 通過prototype實現,指定B的原型物件為A的例項 create()繼承 var o = Object.create({原型物件}, {o物件的內容}); 靜態屬性 靜態方法的特點就是可以直接使用建構函式來呼叫 把屬性直接定義到建構函式上即可。呼叫的時候,也是直接使用建構函式來呼叫。 私有屬性 私有屬性其實就是函式內部的區域性變數。 this指向 this永遠指向一個物件。 this指向的物件是誰,關鍵要看this執行的環境。也就是this所在的函式被賦值給哪個物件了,那麼this就表示這個物件。 全域性環境下,this表示window物件。 事件處理函式中,this表示繫結事件的DOM物件。 面向物件中的this表示函式所屬的物件。 定時器中的this setTimeout(obj.fn, 1000); // 執行的時候,fn 所在的環境丟失。this容易發生改變 setTimeout('obj.fn()', 1000); // 執行的時候,fn還在obj物件環境中,this不會發生變化