天天看點

《Javascript進階程式設計》閱讀筆記 ----第6章對象

對象

元屬性

  • configurable:能否删除屬性,能否修改屬性的特性,能否修改屬性的元屬性。該修改不可逆
  • enumerable:能否使用for…in
  • writable:能否修改值
  • value:屬性的值
  • get:getter
  • set:setter

修改

Object.defineProperty(object, attr, {
	configurable: ...,
	writable:....,
})

Object.defineProperties(object, {
	attr1: {
		value: ....,
	},
	attr2: {
		get: function(){
		}
	}
})
           

擷取元屬性對象

建立對象

  1. 對象字面量
  2. 構造函數(工廠模式)1
  3. 判斷類型:

    instanceof

原型

  1. 我們建立的每個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有執行個體共享的屬性和方法。
  2. 通過構造函數建立出的執行個體對象通過

    _proto_

    即可通路原型對象。
  3. 通過

    isPrototypeOf()

    來确定對象間的原型關系。如
    Person.prototype.isPrototypeOf(person1)
    //person1是執行個體對象
    //Person是構造函數
               
  4. constructor:指針,指向構造函數
    Person.prototype.constructor --> Person
               

原型的動态性

  1. 假設修改原型的屬性,能在所有已建立的執行個體中反映。
    《Javascript進階程式設計》閱讀筆記 ----第6章對象
    原因:執行個體與原型之間的連接配接隻不過是指針,而非一個副本,是以可以在原型中找到新的sayHi
  2. 假如重寫整個原型對象,那麼已建立的執行個體将切斷與原來原型的聯系。
    《Javascript進階程式設計》閱讀筆記 ----第6章對象

建立對象的經典方式

組合模式

執行個體獨有的屬性放在構造函數裡,共享的屬性放在原型裡。

《Javascript進階程式設計》閱讀筆記 ----第6章對象

寄生模式

包裝Array,為他添加一個方法

《Javascript進階程式設計》閱讀筆記 ----第6章對象

注意這裡為什麼是

values.push.apply(values, arguments);

而不是

values.push(arguments)

原因在于arguments是一個對象,隻有使用apply才能将它拆解為數組應用在values上。

  1. 調用構造函數經曆了這些步驟:(1)建立一個新對象;(2)将構造函數的作用域賦給新對象(是以this就指向了這個新對象);(3)執行構造函數中的代碼;(4)傳回新對象

    任何函數通過new調用,就是構造函數; ↩︎