2014-01-06 4 views
-1

Я пишу код, и заметил, что JQuery имеет очень прохладную особенностьКак создать несколько функций JQuery

Например:

$(selector).addClass('').on('').on ('').remove(); 

Я могу сделать это 2.

func(...).func2(''); 

хотел знать, как это сделать (я думаю, я не объяснил правильно).

У этого парня также есть эталон. http://benchmarkjs.com/

Если бы кто-то мог мне помочь, было бы здорово! Спасибо заранее

+2

Читайте «Свободные интерфейсы», «цепочки» и, возможно, «прототипы» в JavaScript. На эту тему есть много информации в Интернете. – elclanrs

+1

В чем ваш вопрос? Любая функция или метод, который возвращает объект с помощью самих методов, может быть скован как jQuery. Вызывается первая функция, она возвращает объект, который вы можете вызвать методами с цепочкой и т. Д. jQuery имеет соглашение для большинства методов для возврата исходного объекта jQuery, что означает, что вы можете вызывать несколько методов на одном и том же объекте jQuery с цепочкой. – jfriend00

ответ

1

Просто возвратите себя в каждой функции:

YourClass.prototype.a = function() { 
    // do a stuff 
    return this; 
}; 
YourClass.prototype.a = function() { 
    // do b stuff 
    return this; 
}; 

new YourClass().a().b(); 

In the comments, вы сказали:

В JQuery, если я прошу HTML (. $() HTML()) это возвращает поток и до сих пор работает

ну, это легко, как хорошо:

YourClass.prototype.html = function(val) { 
    if (val === undefined) { 
     // return the html 
    } else { 
     // set the html to val 
     return this; 
    } 
} 
+0

Я пробовал это, но это не сработало, кажется, что второй функции не существует –

+1

@IagoBruno Точно, что вы пробовали? Не могли бы вы написать скрипку? – Doorknob

+1

Создали ли вы конструктор? – elclanrs

1

Ключ всегда возвращает объект (чтение контекста) для каждого метода. Самый простой пример:

var lib = { 
    a: function() { 
    //... 
    return this; 
    }, 
    b: function() { 
    //... 
    return this; 
    } 
}; 

И использовать его как:

lib.a().b(); 

Но так как это такая обычная вещь, чтобы сделать, подход к беглому интерфейсу является fluent декоратором:

// A fluent function decorator: 
// Takes a function and returns a function that returns `this` 
var fluent = function(f) { 
    return function() { 
    f.apply(this, arguments); 
    return this; 
    }; 
}; 

var lib = { 
    a: fluent(function() { 
    //... 
    }), 
    b: fluent(function() { 
    //... 
    }) 
}; 

lib.a().b(); 

Другой подход с prototypes, используя тот же хелпер:

function Lib() {} // constructor 
Lib.prototype.a = fluent(function() { 
    //... 
}); 
Lib.prototype.b = fluent(function() { 
    //... 
}); 

new Lib().a().b(); 

Декоратор fluent дает вам ключ сразу же в начале функции, вместо того, чтобы отслеживать возвращаемое значение функции.

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