Head First JS閱讀筆記之 自定義對象

自定義對象

object = property + method

我們使用this定義方法會有什麼問題?
如何去解決?

Table property method
class class.prototype.proprty class.method
class-owned instance class.prototype.method = function(){}
instance this.property this.method =
function(){}

Q1: 我們在構造函數中使用this來定義方法會有什麼問題?

js的對象有兩個非常重要的概念:對象類 class 和 對象實例 instance

對象類就是模板,是抽象的,描述了對象的property和method
對象實例是實際的對象,是具體的,把真正的數據放入了property。也就是說,instance的不同之處在於:每一個instance都是有自己的property副本的(instance property)。

如果在對象的構造函數裏面使用this來創建method的話,

this.functionName = function(parameters){
  function_body
}

那麼在每一個instance裏面,都會創建新的同樣的method副本,就會出現方法過載的情況。

顯然,method應該爲對象所共享,所有的instance所指向的應該都是同一個method副本。也就是說,對於每一個對象來說,有獨立的property副本,有共享的method副本。

instance property/method 實例特性/方法很容易區分,它們在構造函數中都是使用關鍵字this來創建。

Q2:我們如何去解決? class-owned instance method

如何創建共享的的方法?—–>類擁有的實例方法class-owned instance method
此時,method是存儲在類裏面,所有的實例共享這一份method代碼,method可以訪問實例特性。

如何實現?—–>用prototy來模擬類
通過每一個對象的隱藏對象prototype(以特性存在)來存儲method,每一個instance可以調用,但是在類裏面運行。

prototype創建類方法時,不再像this放在構造函數裏面,而是放到了構造函數的外面,這裏要注意。

顯然,class 與instance之間的溝通就是通過prototype和constructor
構造函數負責設定實例的一切事項
原型處理類層的一切事項

實例是個變量


Q3:類特性和類方法 class instance/method

instance有特性和方法,聯想到類應該也有自己的特性和方法,前面已經提了類擁有的方法,下面說類特性 class property

類特性也是一份特性,實例共享,使用prototype創建
和全局變量之間的差異在於,類特性必須透過實例被訪問,要使用關鍵字this和點號,
但是還是要和instance 的this區分開,一個在構造函數外,一個在構造函數內。

類特性和實例特性之間的差異在於存儲地點,一個在類裏面,一個在實例裏面

Object.prototype.property = "String"
Object.prototype.functionName = function(params){
    this.property 
    }

類方法 vs 類擁有的實例方法
類方法 class method 爲類所有但無法訪問實例特性
類擁有的實例方法 class-owned instance method 類所有但能訪問實例特性
這兩種方法可以參考java類裏面的private方法和protected方法
類方法就是private的那種,只有類自己可以訪問類的內部
類擁有的是protected的那種

類方法

class_name.class_method = function(){}

類方法裏面不能有this

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章