13. 使用原型 prototype

真正的重用。

prototype 是一個屬性,將共用的部分設定在此,代表是共用部分。

複寫原型,只要直接指定,不用更改呼叫方式。 在原型加入、改變了屬性、方法,所有該原型的物件也立刻會變動,除非有被複寫。

hasOwnProperty

若屬性定義在物件實例,物件的 hasOwnProperty 方法會回傳 true。

原型鍊

讓一個原型繼承另一個原型: e.g. ShowDog 原型繼承自 Dog 原型

  1. 建立一 Dog 建構式
  2. 設 Dog 建構式的原型屬性
  3. 建立一 ShowDog 建構式
  4. 將 ShowDog 建構式的原型,設定成 Dog 的實例 new Dog()
  5. 為 ShowDog 原型設 constructor 屬性:ShowDog.prototype.constructor = ShowDog;
  6. 增修 ShowDog 建構式的原型
  7. 建立 ShowDog 實例

constructor

instenceof 所有你所繼承的建構式都會是 true obj.constructor 物件.建構式,沒有從新設置也會繼承上一個原型。

.call

// ShowDog 建構式
function ShowDog (name, color, age, master){
    this.name = name,
    this.color = color,
    this.age = age,
    this.master = master
}

// 用 Dog 建構式來設定
function ShowDog (name, color, age, master){
    Dog.call( this, name, color, age) 
    // 這裡的 this 是 ShowDog
    // 叫用 Dog 建構式,將 this 帶入 Dog 替換主體,傳入引數、執行 Dog 建構式
    // 在 Dog 建構式中,將以 ShowDog 的實例為 this,
    // Dog 建構式會幫 ShowDog 建立出 name, color, age。
    this.master = master
}

Object 就是一個原型

利用繼承複寫內建行為

Robot.prototype.toString = function(){
    return (this.name + ' 屬於 ' this.owner);
}
  • toString
  • toLocalString 可以針對國家地區提供本地化字串
  • valueOf 提供使用該方法的物件

要小心,Object 中不可復寫的屬性

  • constructor
  • hasOwnProperty
  • isPrototypeOf
  • propertyIsEnumerable 是否可透過迭代來存取此屬性。

利用繼承擴充內建物件

http://jsbin.com/yavehep/edit?js,console

results matching ""

    No results matching ""