2015-10-11 7 views
0

Я пытаюсь вернуть запрос как объект, в моей первой попытке я попробовать метод Object.createКак jQuery быстро клонировать его методы?

var ElementArray = { 
    someMethod : myMethod, 
    .... 
} 

var addMethods = function(elements) { 
    var obj = Object.create(ElementArray); 
    obj[0] = elements; 
    return obj; 
}; 

var getId = function(query) { 
    return addMethods(doc.getElementById(query)); 
}; 

(jsperf)

я сразу же обнаружил, что это было медленнее, чем JQuery (шипение), особенно на светлячок. Проблемы с firefox, где, вероятно, можно использовать обертки между отсеками (see bug here), но я все еще был довольно недоволен.

Я также попытался использовать прототип вместо

var ElementArray = function(){}; 
ElementArray.prototype.someMethod = someMethod; 
.... 

var addMethods = function(elements) { 
    var obj = new ElementArray(); 
    .... 
}; 

Немного лучше на темэ, но по-прежнему очень медленно на светлячок.

Так что мой вопрос в том, как это делает jQuery (sizzle) и другие библиотеки || Каков самый быстрый способ вернуть объект с свойствами экземпляра 1-2? (Все остальное может быть просто ссылки)

+0

JQuery использует 'пр ototype' для его методов. Таким образом, при создании нового объекта, отличного от системы, устанавливающей ссылку на прототип, не будет никакой работы. – jfriend00

+0

@ jfriend00 Поиск через sizzles github repo Я не нахожу метод прототипа (я искал) '.prototype' ... Я что-то упустил? – Burdock

+0

Внутренне он использует '.fn', но это псевдоним' .prototype', и это не на самом деле 'jQuery', а на другом объекте. – jfriend00

ответ

1

Так что мой вопрос, как же JQuery (шипение), и другие библиотеки делают это

JQuery использует прототип. Это как бы скрывает этот факт, наложив прототип на .fn, но он все еще является прототипом. Вот the jQuery function.

jQuery = function(selector, context) { 

    // The jQuery object is actually just the init constructor 'enhanced' 
    // Need init if jQuery is called (just allow error to be thrown if not included) 
    return new jQuery.fn.init(selector, context); 
}, 

И вот the aliasing:

jQuery.fn = jQuery.prototype 

И, реализация the actual jQuery constructor:

init = jQuery.fn.init = function(selector, context, root) { 
    var match, elem; 

    // HANDLE: $(""), $(null), $(undefined), $(false) 
    if (!selector) { 
     return this; 
    } 

    // Method init() accepts an alternate rootjQuery 
    // so migrate can support jQuery.sub (gh-2101) 
    root = root || rootjQuery; 

    ..... 

И, круглолицый о assignment of the `.init.prototype':

// Give the init function the jQuery prototype for later instantiation 
init.prototype = jQuery.fn; 

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

  • Нет связанных вопросов^_^