Есть ли способ jQuery для перебора только собственных свойств объекта?

Я делаю небольшую библиотеку, похожую на jQuery, и одна вещь, которая кажется мне странной, - это поведение _1 _ .

В javascript у нас есть цикл for...in :

for (var key in obj) {
    console.log(key + ': ' + obj[key]);
}

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

Это можно узнать, например, с помощью hasOwnProperty. . И jQuery может сделать это.

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

Проверьте эту скрипку, чтобы увидеть ее в действии и найдите здесь исходный код $.each.

Итак, мой вопрос: есть ли в jQuery метод итерации object, который включает только собственные свойства? Если нет, должна ли библиотека вести себя так?

Изменить: поскольку jQuery этого не делает, вы также можете ответить, полезно ли это. Я имею в виду, что я не вижу, что хочу перебирать свойства прототипа, но, возможно, я что-то упускаю.


person Camilo Martin    schedule 03.12.2012    source источник
comment
Посмотрите и здесь. stackoverflow.com/questions / 1827458 /   -  person mplungjan    schedule 03.12.2012
comment
Единственный способ найти его - использовать hasOwnProperty. jsfiddle.net/mpTkA/2   -  person Selvakumar Arumugam    schedule 03.12.2012
comment
Также Object.keys() есть в новых браузерах.   -  person Pointy    schedule 03.12.2012
comment
согласен, с @Vega, боюсь, что это единственный способ, без сахара от jQuery в этой перспективе   -  person dmi3y    schedule 03.12.2012
comment
@ dmi3y Ах, понятно, это печально. Интересно, должна ли библиотека вести себя подобным образом, потому что сейчас я должен это решить.   -  person Camilo Martin    schedule 03.12.2012
comment
@Vega Я даже упомянул hasOwnProperty в вопросе.   -  person Camilo Martin    schedule 03.12.2012
comment
@CamiloMartin Да, я знаю .. поэтому Этого не было в ответах :)   -  person Selvakumar Arumugam    schedule 03.12.2012
comment
@Pointy, полезно знать) вероятно, _1 _ было бы даже лучше   -  person dmi3y    schedule 03.12.2012
comment
@ dmi3y Нет, если вам нужна поддержка IE8.   -  person Camilo Martin    schedule 03.12.2012
comment
да, поэтому это не ответ) просто немного больше информации на будущее   -  person dmi3y    schedule 03.12.2012
comment
Краткое примечание: убедитесь, что если вы используете собственный _1 _-_ 2_, вы используете var для key: for (var key in obj). В противном случае вы получите случайное глобальное. (Если вы действительно не хотите, чтобы key был глобальным, в этом случае вам, вероятно, следует найти лучший способ делать то, что вы хотите.) Другое небольшое примечание: При использовании hasOwnProperty это может быть немного безопаснее сохранить ссылку вместо того, чтобы называть ее точечной нотацией: var has = Object.prototype.hasOwnProperty; has.call({abc: 'xyz'}, 'abc');.   -  person Keen    schedule 03.12.2012
comment
@ Кори, да, ты совершенно прав. Я пропустил это. И я вижу, что ваше второе замечание имеет смысл (хотя я не уверен, кто будет возиться с hasOwnProperty ...).   -  person Camilo Martin    schedule 03.12.2012


Ответы (1)


Поведение jQuery имеет смысл, поскольку вы всегда можете добавить проверку hasOwnProperty в цикл - или нет.

Я вижу, что перебор унаследованных свойств может быть полезен в некоторых сценариях (клонирование или подкласс или как вы это называете).

person Christophe    schedule 03.12.2012
comment
Эту часть сценария я не мог понять. У вас есть какой-нибудь пример? (И, если нужно добавить проверку hasOwnProperty, можно также использовать for...in и сэкономить время на вводе текста). - person Camilo Martin; 03.12.2012
comment
Например: defaultAjaxSettings = {type: GET, ...}, затем создать клон с некоторыми конкретными настройками, но в остальном наследует настройки по умолчанию? - person Christophe; 03.12.2012
comment
Понятно ... но обычно для работы со значениями по умолчанию в картах параметров используется что-то вроде $.extend, верно? Или в каком-то фреймворке чаще так делают, с наследованием? - person Camilo Martin; 03.12.2012
comment
правильно ... честно говоря, я не знаю. Очевидно, вы захотите использовать наследование, когда вам нужно распространить изменения настроек по умолчанию, но у меня нет лучшего примера. - person Christophe; 03.12.2012
comment
Кроме того, я думаю, что интерес $ .each заключается в предоставлении уровня абстракции, который работает с различными коллекциями (объектами, массивами), и это может быть интересно в некоторых сценариях, таких как создание шаблонов. Но опять же, у меня нет конкретного примера ... - person Christophe; 03.12.2012