2012-07-24 45 views
2

可能重複:
How to detect if a function is called as constructor?有沒有一種方法讓JavaScript函數知道它是否正常調用或與「新」一起調用?

我想在JavaScript中有一個功能,如果它通常被稱爲其行爲有所不同,或者如果它以創建一個新的實例的引用。可能有很多不同的用途,其中兩個功能可以相關或不相關。其中一個用途是從不必鍵入new,免除編碼器時,該函數總是被用來創建新實例:

function MyClass(arg1, arg2) { 
    if(/* not called with "new" */) return new MyClass(arg1, arg2); 

    // instance initialization stuff here... 

} 

這樣我就不必鍵入var x = new MyClass(arg1, arg2):這將是足夠的輸入var x = MyClass(arg1, arg2) (但前者也不會錯)。

只是一個可能用途的例子。

可以這樣做嗎?如果是這樣,怎麼樣?

+0

對不起錯過重複 - 我應該找到關鍵字「構造函數」...感謝您的答案! – Tom 2012-07-25 00:45:57

回答

5

沒有辦法完全確定的函數是怎麼被調用,但是你可以確信使用this instanceof MyClass,就像這樣:

if (this instanceof MyClass) { 
    // Was called with `new` 
} else { 
    // Was called as regular function 
} 

有邊緣的情況下,雖然,例如我可以創建一個MyClass的新實例,然後執行MyClass.call(new MyClass) - 這會產生誤報,因爲外部MyClass未用new調用。

+0

我以此爲基礎,並添加了一個轉折點:初始化新實例時,我在其上設置了一個標誌。所以當函數被調用時,我檢查1)'this'是我的類的'instanceof',2)它的標誌還沒有設置。如果兩個條件都成立 - 這就是「新」(在這種情況下,我設置了標誌並做了我所做的任何事情)。如果沒有,我知道這是一個普通的函數調用(即使是從另一個類的方法)。 – Tom 2012-08-02 20:13:46

1

我能想到的唯一選擇是測試this的值。您可以試試:

function MyClass(args) { 
    var isInstance = this instanceof MyClass; 
    // ... 
} 
1
if(this instanceof MyClass) 

可能是你在找什麼。它可以被.call.apply愚弄,但是如果一個實例被傳遞,構造對象應該沒有任何問題。

相關問題