Javascript 物件導向程式設計(二)

你的好友上線了發表於2018-06-14

目的

  • 理解什麼是原型物件
  • 描述和理解__proto__、原型和建構函式之間的關係。
  • 在原型物件上新增方法和屬性,以編寫更有效的程式碼
  • 解釋向原型新增方法和屬性與建構函式之間的區別
  • 通過prototype物件實現JavaScript中的繼承

關鍵字new

我們之前使用了new關鍵字來從建構函式中建立物件——讓我們回顧一下它的作用

  • 建立一個空物件
  • 將“this”的值賦給該物件
  • 在函式最後新增“return this”
  • 在這些新物件和建構函式的原型屬性上建立一個連線(傳說中的原型鏈) 現在我們專注於第四點,看看原型鏈到底是什麼

一個圖例

Javascript 物件導向程式設計(二)

圖例說明

  • 每一個建構函式都有一個叫做prototype(原型)的屬性,原型屬性的值時一個物件
  • 這個原型物件有一個叫做constructor的屬性,它指向這個建構函式
  • 每次當一個物件用new關鍵字建立的時候,會產生一個"proto" (原型鏈),它會把這個物件和建構函式的原型屬性連線
  • 每一個建構函式都有一個叫做原型的屬性,原型屬性的值時一個物件

程式碼說明

  function Person(name,age){
    this.name = name;
    this.age = age
  }
  var p1 = new Person("p1",12)
  var p2 = new Person("p2",22)
  p1.__proto__ === Person.prototype  // true
  p2.__proto__ === Person.prototype  // true
  Person.prototype.constructor === Person; // true
複製程式碼

原型

原型的位置:原型被建構函式建立,由所有被該建構函式建立的物件共享!!

  // 建構函式
  function Person(name){
    this.name = name;
  }
  // 由Person建構函式建立一個物件
  var p1 = new Person("小美")
  var p2 = new Person("小李")

  Person.prototype.isInstructor = true;
  p1.isInstructor; //true
  p2.isInstructor; //true
 // 我們為什麼可以訪問原型的屬性  
 // __proto__!!
複製程式碼

原型鏈

JavaScript 中如何找到方法和屬性? 圖例說明

Javascript 物件導向程式設計(二)

重構程式碼

既然我們知道由同一個建構函式建立的物件有一個共享的原型,讓我們重構一些程式碼:

  function Person(name) {
    this.name = name
  }
  Person.prototype.sayHi = function() {
    return "Hi " + this.name
  }
  var p1 = new Person("dd")
  p1.sayHi() // Hi dd
複製程式碼

自我測試

  • 建立一個建構函式Vehicle:從這個建構函式建立的每個物件都應該有一個make、model和year屬性。每個物件還應該有一個名為isRunning的屬性,該屬性應該設定為false
  • 從Vehicle建構函式建立的每個物件都應該具有一個名為turnOn的函式,該函式將isRunning屬性更改為true
  • 從Vehicle建構函式中建立的每個物件都應該有一個名為turnOff的函式,它將isRunning屬性更改為false。
  • 從Vehicle建構函式建立的每個物件都應該有一個名為honk的方法,該方法只在isRunning屬性為true時返回字串“beep”

測試程式碼

  function Vehicle(make, model,year) {
    this.make = make
    this.model = model
    this.year = year
    this.isRunning = false
  }
  Vehicle.prototype.turnOn = function () {
    this.isRunning = true
  }
  Vehicle.prototype.turnOff = function () {
    this.isRunning = false
  }
  Vehicle.prototype.honk = function () {
    if (this.isRunning === true) {
      return 'beep'
    }
  }

複製程式碼

相關文章