2011-01-29 46 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。