2012-06-29 89 views
2

我有這樣的代碼:JavaScript是對象或函數

var obj = function (i) { 
    this.a = i; 
    this.init = function() { 
     var _this = this; 
     setTimeout(function() { 
      alert(_this.a + ' :: ' + typeof _this); 
     }, 0); 
    }; 
    this.init(); 
}; 

obj('1'); 
obj('2'); 
obj('3'); 
new obj('4');​​​ 

http://jsfiddle.net/kbWJd/

腳本警報 '3 ::對象' 三次, '4 ::對象' 一次。

我知道這是爲什麼。這是因爲new obj('4')用它自己的內存空間創建了一個新實例,並且之前的調用共享了它們的內存空間。在obj的代碼中,如何確定我是新對象還是函數,因爲typeof _this只是說'對象'?

謝謝。

回答

2

這是你在找什麼?如果在函數內部執行沒有new關鍵字this的函數等於包含對象(在這種情況下爲window)。

if(this === window){ 
    console.log('not an object instance'); 
} else { 
    console.log('object instance'); 
} 

實施例具有不同的包含對象:

var obj = { 

    method: function(){ 

     if(this === obj){ 
      alert('function was not used to create an object instance'); 
     } else { 
      alert('function was used to create an object instance'); 
     } 

    } 

}; 


obj.method(); // this === obj 

new obj.method(); // this === newly created object instance 
+0

YES。謝謝,正是我需要的。 –

+0

這個方法不是要求你知道函數的內部調用什麼上下文嗎? –

+0

@sam不知道我明白。 if語句確定上下文。 –

2

instanceof操作者可以利用另一種解決方案:

var foo = function() { 
    if (this instanceof foo) { 
     // new operator has been used (most likely) 
    } else { 
     // ... 
    } 
};