Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.01.2010, 19:23
Новичок на форуме
Отправить личное сообщение для sartas Посмотреть профиль Найти все сообщения от sartas
 
Регистрация: 08.01.2010
Сообщений: 3

Цепочка функций
Сделал аналог цепочек jQuery.

код:
(function(){

var 
    window = this,
    undefined,

    jQuery = window.jQuery = window.$ = function( selector, context ) {
        return new jQuery.fn.init( selector, context );
    };

jQuery.fn = jQuery.prototype = {
    init: function( selector, context ) {

        // Если selector - объект, возвращаем его
        if ( selector.nodeType ) {
            this[0] = selector;
            return this;
        }

        // В противном случае берем элемент по id
        var elem = document.getElementById( selector );
        var ret = jQuery( elem );

        return ret;
        
    },

    // Наши функции
    raz: function() {
        this[0].innerHTML += 'первая пошла, ';
    return this;
    },
    
    dva: function() {
        this[0].innerHTML += 'вторая пошла, ';
    return this;
    },
    
    tri: function() {
        this[0].innerHTML += 'третья пошла ';
    return this;
    }
};

jQuery.fn.init.prototype = jQuery.fn;

})();


sample:
<div id='sampleid'></div>
    <script type="text/javascript">
    
        $('sampleid').raz().dva().tri();

    </script>


Можно ли использовать такую реализацию цепочек? Какие могут возникнуть проблемы?
Ответить с цитированием
  #2 (permalink)  
Старый 08.01.2010, 19:36
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

что-то куча связей fn-init-prototype и ненужных оберток
function $(…) {
    return new $.wrapper(…);
}

$.wrapper = function (…) {
    this… = …;
};

$.wrapper.prototype = $.prototype = {
    constructor: $,
    raz: …,
    dva: …,
    tri: …
};

Проблем вроде нет, если удобно, ни что не мешает использовать.

Последний раз редактировалось Octane, 08.01.2010 в 19:38.
Ответить с цитированием
  #3 (permalink)  
Старый 09.01.2010, 01:26
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от sartas
var window = this,
Зачем это?
__________________
Тонкости ECMAScript
Ответить с цитированием
  #4 (permalink)  
Старый 09.01.2010, 16:14
Новичок на форуме
Отправить личное сообщение для sartas Посмотреть профиль Найти все сообщения от sartas
 
Регистрация: 08.01.2010
Сообщений: 3

Это из jQuery

var 
// Will speed up references to window, and allows munging its name.
window = this,
// Will speed up references to undefined, and allows munging its name.
undefined,
Ответить с цитированием
  #5 (permalink)  
Старый 09.01.2010, 16:41
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от sartas
Это из jQuery

Выделить все

var
// Will speed up references to window, and allows munging its name.
window = this,
// Will speed up references to undefined, and allows munging its name.
undefined,
Тот, кто это написал (я не знаю, Резиг или нет) не понимал две важные вещи:

1. Самое главное - если он вызывает в дальнейшем код в контексте this, который был присвоен изначально в локальную переменную window (т.е. глобальный объект), то this - всегда будет работать быстрее, т.к. this не резолвится вообще, он определён единожды при входе в контекст, а вот локальная переменная window будет резолвится всегда при обращении. Так что, здесь имеет место быть явное недопонимание, как и почему "оно" так работает.

2. Есть принципиальная разница между объектом window и глобальным объектом (this в глобальном контексте - есть глобальный объект). Первый - это хост-объект, второй - это нативный объект. Да и не всегда, window - рекурсивная ссылка на глобальный объект; в некоторых реализациях это не так (хотя в стандарте - и в 3-ей, и в 5-ой редакциях это отмечается).

А тут, получается, автор этого кода сохраняет в локальную переменную глобальный объект (т.е. уже меняет поведение, которое было бы у хост-объекта windiow), и, наивно думает, что это что-то ускорит. Наоборот.

Если бы он сделал var window = window, было бы другое дело. А в его случае, удобней было бы всегда использовать this, который был бы определён только один раз, а не постоянно, как window.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 09.01.2010 в 16:46.
Ответить с цитированием
  #6 (permalink)  
Старый 09.01.2010, 19:03
Новичок на форуме
Отправить личное сообщение для sartas Посмотреть профиль Найти все сообщения от sartas
 
Регистрация: 08.01.2010
Сообщений: 3

Спасибо.
А разработчикам jQuery это никто не смог объяснить?
Ответить с цитированием
  #7 (permalink)  
Старый 09.01.2010, 23:23
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от sartas
А разработчикам jQuery это никто не смог объяснить?
те кто юзают jQuery вобще походу не смотрели исходники... вот и юзайте дальше....
Ответить с цитированием
  #8 (permalink)  
Старый 11.01.2010, 19:31
Интересующийся
Отправить личное сообщение для Volk_88 Посмотреть профиль Найти все сообщения от Volk_88
 
Регистрация: 23.07.2009
Сообщений: 17

Цитата:
window = this
Что касается данного выражения, думаю это было сделано из учета обращения к глобальному объекту в коде фреймворка, где this - не является глобальным объектом, пример:

1) Тут вполне можно вместо window поставить this
Цитата:
var window = this,
undefined,
_jQuery = window.jQuery,
_$ = window.$,

jQuery = this.jQuery = this.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
}
2) В данном случае, window ссылается на Global, а вот this уже на jQuery (или я не прав? =) ), но вот я так и не понял, для чего реализована функция noConflict
Цитата:
(Релиз: 1.3.1, строка: 612)

jQuery.extend({
noConflict: function( deep ) {
window.$ = _$;

if ( deep )
window.jQuery = _jQuery;

return jQuery;
}
3) И тут понятное дело, this уже не указывает на Global
Цитата:
(Релиз: 1.3.1, строка: 612)

jQuery.event = {
handle: function(event) {
// returned undefined or false
var all, handlers;

event = arguments[0] = jQuery.event.fix( event || window.event );
Возможно я и ошибся, но введение данной переменной было необходимо, но в кое каких местах можно было обойтись без нее, но вот вопрос, а на сколько бы изменение в первом примере window на this дало бы выигрыш? может быть он настолько маленький, что разработчики jquery забили на него болт? =)

кстати, присоединяюсь к PeaceCoder, по поводу использования фреймвороков, порой зайдешь на форум, что бы найти алгоритм решения определенного вопроса, и порой появляется отвращения от всех тем(даже в разделе "для профи"), так как все только и знают, как решить вопрос с помощью фреймворков, а где же чистый javascript, про который наверно уже все забыли...а может и вообще не знали, в итоге появляется стада баранов, а не программистов, у которых спросишь "А ты знаешь javascript?" а они ответят: "да, конечно, это же jQuery", прям даже страшно становиться ))))
Ответить с цитированием
  #9 (permalink)  
Старый 11.01.2010, 19:47
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Volk_88
Возможно я и ошибся, но введение данной переменной было необходимо, но в кое каких местах можно было обойтись без нее
если не вводить переменную window, которая покроет глобальный обьект window, то где бы ты не обращался к window - он и в африке будет window. для этого надо знать что такое область видимости переменных и как она работает.
Сообщение от Volk_88
у которых спросишь "А ты знаешь javascript?" а они ответят: "да, конечно, это же jQuery", прям даже страшно становиться ))))
согласен на все 100%. иногда сталкивался со знатоками фреймворков и когда начинаешь с ними разговаривать на эту тему аж отвращение появляется что к фреймворку, что к самому человеку, который не хочет понимать, что ты ему обьясняешь/говоришь.
фреймворки vs. JS это тоже самое как Assembler vs C++ или C++ vs VisualBasic
Как можно доказывать что высоко уровневый язык быстрее своего родителя? А таких не мало...
Ответить с цитированием
  #10 (permalink)  
Старый 11.01.2010, 19:57
Интересующийся
Отправить личное сообщение для Volk_88 Посмотреть профиль Найти все сообщения от Volk_88
 
Регистрация: 23.07.2009
Сообщений: 17

Сообщение от PeaceCoder Посмотреть сообщение
если не вводить переменную window, которая покроет глобальный обьект window, то где бы ты не обращался к window - он и в африке будет window. для этого надо знать что такое область видимости переменных и как она работает.
благодарю за поправку, область видимость переменных то знаю (за что спасибо Dmitry A. Soshnikov), но вот сглупил и забылся из-за малого опыта программирования на JS.

Сообщение от PeaceCoder Посмотреть сообщение
Как можно доказывать что высоко уровневый язык быстрее своего родителя? А таких не мало...
имхо, таких людей лучше обходить стороной, толку от них мало, а мозг и нервы потреплют хорошо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерактивный редактор графиков функций Иван Карев Ваши сайты и скрипты 8 01.10.2009 17:02
setInterval, и замена функций SunnyDay Общие вопросы Javascript 16 29.08.2009 00:51
как сложить результаты двух(и более) функций? art-kl Элементы интерфейса 2 26.08.2009 16:56
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
подскажите с параметрами функций hadji29 Общие вопросы Javascript 2 15.02.2009 20:39