Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript array notation on object

I'd like to know how this works behind the scenes: https://learn.jquery.com/using-jquery-core/faq/how-do-i-pull-a-native-dom-element-from-a-jquery-object/

How does JQuery set up foo[0] to execute the get function. I had a look at the source code but all I found was this:

get: function( num ) {
    return num != null ?

        // Return just the one element from the set
        ( num < 0 ? this[ num + this.length ] : this[ num ] ) :

        // Return all the elements in a clean array
        slice.call( this );
},

How can I my own object so that accessing an array index calls a function like this?

I'd like to do the same thing:

myObj[0];

acts identically to

myObj.get(0);

Looking a JQuery this must be possible as it doesn't just set this[0] = 'whatever' for each index manually, it executes the .get function somehow. Is there a way to say whenever an array lookup is made, to execute a function?

like image 627
Tom B Avatar asked Mar 11 '23 20:03

Tom B


2 Answers

It's because in jQuery 0 is the key of the property in the object which holds the DOMElement. This means that you're actually accessing an object by key, not an array by index. The get() method is just a wrapper for that accessor. Here's a working example:

var obj = {
    '0': 'hello!',
    get: function(key) {
    	return this[key];
    }
};

console.log(obj[0]);
console.log(obj.get(0));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
like image 180
Rory McCrossan Avatar answered Mar 23 '23 17:03

Rory McCrossan


How does JQuery set up foo[0] to execute the get function

It's the other way round. get(0) simply calls [0].

jQuery creates an array-like stack of element objects, so it follows that, to extraxt one, you can use array syntax, e.g. [0].

like image 37
Mitya Avatar answered Mar 23 '23 16:03

Mitya