1. 程式人生 > 其它 >建構函式和原型

建構函式和原型

技術標籤:JavaScript

在ES6之前,物件不是基於類建立的,而是用一種稱為構建函式的特殊函式來定義物件和它們的特徵

建立物件的三種方式:

  • 物件字面量
var obj = {};
  • new Object()
var obj = new Object()
  • 自定義建構函式
function Star(uname,age){
  this.uname = uname;
  this.age = age;
  this.sing = function(){
    console.log('唱歌')
  }
}

var ldh = new Star('劉德華',18)
//例項成員就是建構函式內部通過this新增的成員uname age sing 就是例項成員
//例項成員只能通過例項化的物件來訪問

Star.sex = '男'
//靜態成員在建構函式本身上新增的成員 sex就是靜態成員
//靜態成員只能通過建構函式來訪問
console.log(Star.sex )

建構函式

建構函式是一種特殊的函式,主要用來初始化物件,即為物件成員變數賦初始值,它總與new一起使用,我們可以把物件中一些公共的屬性和方法抽取出來,然後封裝到這個函式裡面

new在執行時會做四件事情

  1. 在記憶體中建立一個新的空物件
  2. 讓this指向這個新的物件
  3. 執行結構函式裡面的程式碼,給這個新物件新增屬性和方法
  4. 返回這個新物件(所以建構函式裡面不需要return)

建構函式方法很好用 , 但是存在浪費記憶體的問題

建構函式原型 prototype

建構函式通過原型分配的函式是所有物件所共享的

JavaScript規定 , 每一個建構函式都有一個prototype屬性 , 指向另一個屬性 . 注意這個prototype就是一個物件 , 這個物件的所有屬性和方法,都會被建構函式所擁有

我們可以把那些不變的方法 , 直接定義在prototype物件上 , 這樣所有物件的例項就可以共享這些方法

物件原型 _proto_

物件都會有一個屬性_proto_指向建構函式的prototype原型物件 , 之所以我們物件可以使用建構函式prototype原型物件的屬性和方法 , 就是因為物件有_proto_原型的存在

_proto_物件原型和原型物件prototype是等價的

constructor 建構函式

物件原型(_proto_)建構函式(prototype)原型物件裡面都有一個屬性constructor屬性 , constructor我們稱為建構函式,因為它指回構函式本身

繼承

ES6之前並沒有給我們提供extends繼承,我們可以通過建構函式+原型物件模擬實現繼承, 被稱為組合繼承

call()

呼叫這個函式 , 並且修改函式執行時的this指向

fun.call(thisArg, arg1 , arg2 , ...)
  • thisArg:當前呼叫函式this的指向物件
  • arg1, arg2 :傳遞的其他引數

借用建構函式繼承父型別屬性

核心原理:通過call()把父型別的this指向子型別的this , 這樣就可以實現子型別繼承父型別的屬性

      //借用父建構函式繼承屬性
      //1.父建構函式
      function Father(uname, age) {
        //this 指向父建構函式的物件例項
        this.uname = uname;
        this.age = age;
      }
      //2. 子建構函式
      function Son(uname, age) {
        //this指向子建構函式
        Father.call(this, uname, age);
      }
      var son = new Son("ldh", 18);
      console.log(son);