JavaScript的構造函數

在面向對象的類C語言如Java語言中,咱們使用構造函數是實例化對象的過程,在JavaScript語言中咱們能夠使用構造函數的方式建立對象,如:javascript

let obj = new LanguageFun("javaScript")

與面向對象的語言不一樣,JavaScript使用構造函數建立對象不是真正意義上的實例化,而是經過new操做符調用的構造函數。java

構造函數的執行過程:函數

  1. 建立一個新的對象obj
  2. obj被執行原型鏈[[prototype]]鏈接
  3. obj綁定到函數調用的this上
  4. 沒有其餘返回對象,則返回obj

包括咱們知道的內置函數Number(), String()均可以使用new操做符建立新的對象,這種函數在JavaScript中稱爲構造函數的調用。咱們能夠經過實例理解這個過程:測試

function LanguageFun(name){
    this.name = name
    this.sayHello = function(){
        console.log("Hello , ",this.name)
    }
}

let obj = new LanguageFun("javaScript") 
obj.sayHello(); // Hello ,  javaScript

new LanguageFun()執行過程:this

  1. 對象建立:建立一個全新的對象: let obj = new Object();
  2. [[prototype]]鏈接:obj.__proto__ = LanguageFun.prototype
  3. this綁定:this指向剛建立的obj對象
  4. 執行LanguageFun()函數
  5. 返回this對象

測試:prototype

console.log(obj.__proto__ === LanguageFun.prototype); //true

兼容處理

當咱們使用new操做符調用構造函數的時候沒有問題,可是有時候咱們會忘記使用new操做符,使用了普通函數的調用方式,產生異常,因此咱們須要對JavaScript的構造函數進行兼容改造。code

function LanguageFun(name){
    if(!(this instanceof LanguageFun)) {
        return new LanguageFun(name)
    }
    this.name = name
    this.sayHello = function(){
        console.log("Hello , ",this.name)
    }

}

let obj1 = new LanguageFun("javaScript") 
let obj2 =  LanguageFun("javaScript") 

obj1.sayHello(); // Hello ,  javaScript
obj2.sayHello(); // Hello ,  javaScript
相關文章
相關標籤/搜索