Bug Tracker

Opened 6 years ago

Closed 5 years ago

#6132 closed enhancement (wontfix)

jQuery.each includes prototype functions

Reported by: agoebel Owned by:
Priority: undecided Milestone: 1.4.2
Component: core Version: 1.4.1
Keywords: each, object, prototype Cc: agoebel@…
Blocked by: Blocking:

Description

I'm not entirely sure if this is deliberate or not, but the way jQuery handles the each method includes anything defined in the prototype.

Example:

Object.prototype.newMethod = function() {};
...
var keys = [],
    map = {
        'a': 1,
        'b': 2,
        'c': 3
    };

var 
jQuery.each( map, function(k,v) {
    keys.push(k);
};

the keys array has a value of:

['a','b','c','newMethod']

The change is pretty trivial. Simply add a hasOwnProperty filter to the object portion of the each method.

//starting from line 556
if ( isObj ) {
    for ( name in object ) {
        if ( !object.hasOwnProperty(name) ) {
            continue;
        }
        if ( callback.apply( object[ name ], args ) === false ) {
            break;
        }
    }
}

Using this code, keys is:

['a','b','c']

Which I personally think is what it should be. As an alternative, maybe a flag can be introduced to determine whether or not prototype values are filtered out.

The modified jquery-1.4.2 file is attached. I tested the example and patched code in firefox 3.6, chrome 4.0, and IE8.

Attachments (1)

jquery-1.4.2.modified.js (160.1 KB) - added by agoebel 6 years ago.
jQuery 1.4.2 with $.each modified to exclude prototype/inherited values of an object

Download all attachments as: .zip

Change History (2)

Changed 6 years ago by agoebel

jQuery 1.4.2 with $.each modified to exclude prototype/inherited values of an object

comment:1 Changed 5 years ago by snover

  • Priority set to undecided
  • Resolution set to wontfix
  • Status changed from new to closed

A user can use hasOwnProperty to filter out anything from the prototype that they want to already; this patch only limits the ability for users to decide whether or not they want to access prototype members too.

Note: See TracTickets for help on using tickets.