2011-01-29 54 views
0

我有一些原型功能添加到Object,在我看來在某些情況下是實用的。不過,我注意到當我執行$ .get時,原型函數被作爲數據成員處理,並且被髮送爲http://...?prototypefunc=false

這是無用的,因爲我不提供這些作爲數據成員,但他們被添加到查詢字符串。

確切的說,我有這樣的代碼:

Object.prototype.in = function() { 
    for(var i=0; i<arguments.length; i++) 
     if(arguments[i] == this) return true; 
    return false; 
} 

$.get('http://localhost/test.php', {'test': 'foo'}, function(text) { }); 

相應的URL結構是:

http://localhost/test.php?test=foo&in=false

我怎樣才能避免這種情況?

+4

這就是爲什麼不擴展Object.prototype的原因。 – 2011-01-29 23:18:45

+0

爲什麼不能?它在例如`foo.in(1,2,3)`來檢查foo是否等於1,2或3. – pimvdb 2011-01-29 23:19:25

+1

@pimvdb:因爲它可能有副作用(如你所見)。 `Helper.in(this,[1,2,3])``不是更多的代碼。否則,解決您的問題的唯一方法是編輯jQuery代碼。 – 2011-01-29 23:21:25

回答

2

jQuery在傳遞的對象上運行for...in循環,該循環遍歷對象的所有可枚舉屬性,無論是否繼承。它不會執行任何檢查來查看對象的屬性是由對象擁有的還是通過原型鏈繼承的。

此外,如果在對象序列化過程中遇到屬性的值是一個函數,它將執行該函數並使用返回值。

有幾個解決方案:

  • 更改您的代碼,以便它不修改Object.prototype
  • 傳遞字符串而不是對象,或者使用自己的代碼將對象序列化爲字符串。
  • 用你自己的函數覆蓋jQuery.param()函數,強制它用.hasOwnProperty(propertyName)檢查每個屬性。
  • 使用Object.defineProperty()(僅限符合ECMAScript 5的瀏覽器)使原型鏈上的屬性不可枚舉。
1

在你的情況,如果你dont't要刪除的功能,你應該序列數據(與功能,其工作原理與之相似jQuery的連載)字符串,並將其追加到URL。