2011-01-29 1 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'. –

+0

Почему бы и нет? Он настолько полезен, например, 'foo.in (1,2,3)', чтобы проверить, равно ли foo 1, 2 или 3. – pimvdb

+1

@pimvdb: потому что это может иметь побочные эффекты (как вы можете видеть). Не так уж много кода имеет «Helper.in» (это [1,2,3]) ». В противном случае единственным способом исправить вашу проблему будет редактирование кода jQuery. –

ответ

2

jQuery запускает цикл for...in на переданный объект, который выполняет итерацию по всем перечислимым свойствам объекта, независимо от того, унаследован он или нет. Он не выполняет никаких проверок, чтобы проверить, принадлежит ли свойство объекта объекту или унаследовано через цепочку прототипов.

Кроме того, если он встречает свойство, значение которого является функцией во время сериализации объекта, он будет выполнять функцию и использовать возвращаемое значение.

Есть несколько решений:

  • Изменить код так, чтобы он не изменяет Object.prototype.
  • Передайте строку вместо объекта или сериализуйте объект в строку, используя собственный код.
  • Переопределите функцию jQuery.param() со своим собственным и заставьте ее проверить каждое свойство с помощью .hasOwnProperty(propertyName).
  • Сделать свойство в цепочке прототипов неперечислимым, используя Object.defineProperty() (только для браузеров, совместимых с ECMAScript 5).
+0

Спасибо, что поделились своими идеями, особенно с последним, я не знал об этой функции. – pimvdb

1

В вашем случае, если вы dont't хотите удалить, что в функции, вы должны сериализовать данные (с функцией, которая работает точно также с JQuery сериализации) в строку и добавить его к URL.

+0

Спасибо, '$ .param' отлично работает! – pimvdb

+0

@pimvdb: что вы имеете в виду? Функции сериализации jQuery сопоставляются с '$ .param' под капотом, поэтому вы должны получить тот же результат. –

+0

@Ande E - моя ошибка, поэтому я отредактировал и удалил код с функцией param и проголосовал за ваш ответ. Но pimvdb уже прочитал мой ответ - извините за беспорядок:/ – singles

Смежные вопросы