2016-07-01 3 views
4

Я хотел бы знать, как это работает за кулисами: https://learn.jquery.com/using-jquery-core/faq/how-do-i-pull-a-native-dom-element-from-a-jquery-object/Javascript массив обозначения на объекте

Как настроить JQuery foo[0] для выполнения функции get. Я имел взгляд на исходный код, но все, что я нашел, было это:

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); 
}, 

Как я могу мой собственный объект таким образом, чтобы доступ к индексу массива вызывает функцию, как это?

Я хотел бы сделать то же самое:

myObj[0]; 

действует идентично

myObj.get(0); 

Глядя JQuery это должно быть возможным, поскольку это не просто набор this[0] = 'whatever' для каждого индекса вручную , он каким-то образом выполняет функцию .get. Есть ли способ сказать, когда выполняется поиск массива, чтобы выполнить функцию?

ответ

4

Это потому, что в jQuery 0 является ключом свойства объекта, который содержит DOMElement. Это означает, что вы фактически обращаетесь к объекту по ключу, а не по индексу. Метод get() - это просто оболочка для этого аксессуара. Вот рабочий пример:

var obj = { 
 
    '0': 'hello!', 
 
    get: function(key) { 
 
    \t 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>

3

Как настроить JQuery Foo [0] для выполнения функции ПОЛУЧИТЬ

Это наоборот. get(0) просто звонит [0].

jQuery создает подобный массиву стек элементов-элементов, поэтому следует, что для экстрахтера один, вы можете использовать синтаксис массива, например. [0].

0

После реализации метода JQuery не будет работать для меня, как я хотел, чтобы выполнить код на вызов, я нашел решение, используя прокси-объекты:

var p = new Proxy(Obj, { 
    get(target, name, receiver) { 
    console.log(name); 
    return name; 
    } 
}); 

p[0] напечатает 0 и позволяют выполнение кода внутри функции. Я не уверен, что это будет работать во всех браузерах, но это для проекта узла.

Смежные вопросы