javascript建立安全的建構函式

antzone發表於2017-03-21

在javascript中,任何一個函式都可以作為建構函式,只要使用new運算子呼叫一個函式,那麼這個函式就是被當做建構函式使用,程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
function antzone(webName){
  this.name=webName;
}
var oantzone=new antzone("螞蟻部落");
console.log(oantzone.name);

以上程式碼就是將antzone作為建構函式使用。

antzone作為建構函式使用的時候是沒有任何問題的,但是如果作為普通的函式使用,this的指向就有可能是其他物件,那麼就有可能造成汙染,下面就將此程式碼進行一下改造,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
function antzone(webName){
  if(this instanceof antzone){
    this.name=webName;
  }
  else{
    return new antzone(webName)
  }
}

上面程式碼就可以構建一個相對安全的建構函式,下面就對程式碼的程式碼做一下分析:

首先判斷this是否是antzone建構函式的例項,如果是的話,那麼antzone就是作為建構函式使用,否則就是作為普通函式,當作為普通函式的時候,就強行作為建構函式使用。

特別說明:

如果上面的使用call()或者appy()方式被其他建構函式繼承的時候,需要做一下改造,因為在預設狀態下this instanceof antzone返回值一般是false,不過如果其他函式繼承自antzone就可以了,演示程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
function antzone(webName){
  if(this instanceof antzone){
    this.name=webName;
  }
  else{
    return new antzone(webName)
  }
}
function func(){}
func.prototype=new antzone();
func.prototype.constructor=func;
var ofunc=new func();
antzone.call(ofunc,"螞蟻部落");
console.log(ofunc.name);

將func的原型設定為antzone的例項,func就是繼承於antzone,則this instanceof antzone返回值為true。

相關文章