$ .get отправляет функции прототипа в URL запроса? - PullRequest
0 голосов
/ 30 января 2011

У меня есть некоторые функции-прототипы, добавленные к 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

Как мне избежать этого?

Ответы [ 2 ]

2 голосов
/ 30 января 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...