2011-10-17 57 views
-1

有人知道如何獲取原型屬性下的typeof對象嗎?即我有下面的代碼:獲取原型函數下的對象類型

Object.prototype.someproperty = function(){ 
...do something... 
console.log(typeof this); 
..more... 
} 

在我的代碼,這導致送花兒給人的「功能」,因爲對象的構造函數的函數。當我這樣打電話

Array.someproperty(); //In this i want get "array" 
//or 
String.someproperty(); //In this i want get "string" 

我想獲得「數組」而不是「功能」...有人知道如何?

+1

typeof []將始終返回「object」,因爲所有數組都是對象(在JavaScript中)。檢查數組的更好方法是 - 'Object.prototype.toString.call(yourVariableHere)==='[object Array]'' –

+0

我已經用這個簡單的「名稱」解決了我的問題。 Object.prototype.myfn = function(){ \t return this.name; } String.myfn(); //返回「String」 Array.myfn(); //返回「數組」 Function.myfn(); //返回「函數」 Object.myfn(); //返回「Object」 Number.myfn(); //返回「數字」 我通過爭議改變了「myfn」的「someproperty」。謝謝你們。 – iLevi

+0

呃,再一次,你只是將'myfn'應用到函數中!如果這是你的意圖,你應該擴展'Function.prototype'而不是'Object.prototype'。這是非常真實的原因。另外,如果您需要全面的瀏覽器支持,函數上的'.name'是非標準屬性,並且在某些瀏覽器中不起作用。 – user113716

回答

0

最後,在這段時間和大量的閱讀和學習中,我看到擴展原型對象是非常糟糕的做法。我感謝大家的支持。

1

這裏的問題是this當通過ArrayString調用時被綁定到函數而不是類型的一個實例。我知道,以確定哪些這些函數被調用的唯一辦法是做類似下面的

Object.prototype.someproperty = function() { 
    if (this === Array) { 
    return "array"; 
    } else if (this === String) { 
    return "string"; 
    } 
    ... 
} 

手動測試在這種情況下,雖然您實際上並不報告對象的類型被調用的原型從。值「功能」是相當準確的。這更像是一種啓發式而不是真正的類型測試

+0

如果這是OP實際想要做的事,那麼擴展'Function.prototype'會是一個改進。 – user113716

+0

@Ӫ_._Ӫ可能。我不是100%確定OP的意圖在這裏。我最初的反應是他們想要一個可以處理所有實例的函數,但是後來爲什麼使用'Array'和'String'構造函數失敗了。如果是這樣的話,那麼在Object上的擴展就更有意義了。總的來說,雖然這種類型的測試似乎註定是最好的片狀 – JaredPar

+0

是的,這很混亂,特別是因爲該方法被命名爲「someproperty」。但無論哪種方式,IMO'Object.prototype'擴展(無論如何都是可枚舉的擴展)很少有意義。但是,如果這就是OP想要的,那麼OP就是這樣。 ;) – user113716