Гарантирует ли jQuery совместимость с расширяющимся прототипом Array или Object? - PullRequest
0 голосов
/ 26 апреля 2011

Я хочу расширить Array и Object, как показано в следующем коде:


$(window).load(function() {
    Array.prototype.x = 3
    Object.prototype.y = 4

    var a = [1, 2]
    for (var i in a) {
        alert(i + ': ' + a[i])
    }
})

/*
[result]
0: 1
1: 2
x: 3
y: 4
*/

Не вызовет ли этот код какие-либо проблемы в работе jQuery в текущей или будущей версии jQuery?

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

С Array.prototype, я думаю, вы в безопасности.Я не думаю, что есть явная гарантия где-либо, но jQuery сосуществует на сайтах с Prototype и MooTools в течение многих лет, и они оба расширяют Array.prototype.Я не думаю, что команда jQuery захочет нарушить совместимость с этими библиотеками.

Но: Никогда не расширяйте Object.prototype.Это вполне может нарушить собственный код jQuery и почти наверняка также нарушит код плагина.Большинство циклов for..in предполагают, что {} не будет иметь перечисляемых свойств.Если вы добавите к Object.prototype, вы сделаете это предположение недействительным.(Если только вы не используете новую функцию ECMAScript5 defineProperty, которая позволяет делать свойства не перечисляемыми, но пока еще не поддерживается широко. Однако для интереса вы можете попробовать здесь .)

0 голосов
/ 26 апреля 2011

Джон Резиг (создатель jQuery) однажды написал, что jQuery безопасен от расширения Array.prototype, но не на 100% безопасен от расширения Object.prototype (я не помню точного места, вероятно, это было в объявлении нового версия jQuery). Официальной гарантии AFAIK нет, но целью jQuery является устойчивость к таким изменениям и проблемам, когда расширенные прототипы (такие как this или this ) обрабатываются как ошибки, хотя и Как видно из примеров, их исправление может занять некоторое время, поэтому даже расширяя массив, вы несколько повышаете риск ошибки.

0 голосов
/ 26 апреля 2011

Нет, я не знаю таких гарантий от jQuery.

Сам jQuery не расширяет никаких собственных прототипов, поэтому он в значительной степени самодостаточен, за исключением некоторого ограниченного вмешательства в узлы DOM.Тем не менее, вы не можете полагаться на плагины jQuery, написанные другими, чтобы они также вели себя хорошо, когда вы расширяете Array и Object, как это.Многие другие библиотеки действительно расширяют Array, но расширение Object имеет более серьезные последствия, поскольку затрагивает каждый отдельный объект.

Будет ли оно работать со всеми будущими версиями jQuery?Догадайся :) 1009 *

...