In JavaScript functions have similarities to objects. The word "attributes" is not correct here, but "properties", and therefore functions can have properties that in case they are functions are called "methods".
So you can create a function with whatever name you want, including the name of $
as jQuery did. You can then add properties or methods to that specific function (to that specific instance) or the prototype of a function, which makes these methods and properties available to all functions of that prototype.
Look at the example where I create two functions, and different ways of adding properties and adding properties "globally" to all functions
// declaração da função
function $_$(seletor) {
return [...document.querySelectorAll(seletor)];
}
// declaração de outra função
function qqCoisa() {
return 'Qualquer coisa...';
}
// adicionar uma propriedade à instância
$_$.descricao = 'Uma função minha...';
console.log($_$.descricao); // Uma função minha...
console.log(qqCoisa.descricao); // "undefined" - nada, esta função não tem esta propriedade
Function.prototype.metodoGlobal = function() {
return 'Eu sou global...';
}
console.log($_$.metodoGlobal()); // Eu sou global...
console.log(qqCoisa.metodoGlobal()); // Eu sou global...
What happens in jQuery is that you create a single, more specific instance that receives a series of methods. And to be able to have the internal context (use this
and give you values that only affect that instance) you have to use the new
function constructor.
Example:
const $_$ = (function() {
// defenição da função principal que retorna a instância para se poder usar outros métodos encadeados
function $_$_proto(seletor) {
this.conteudo = [...document.querySelectorAll(seletor)];
return this;
}
// um método adicionado ao protótipo para que todas as intâncias venham com ele
$_$_proto.prototype.buscarTags = function() {
return this.conteudo.map(el => el.tagName.toLowerCase());
}
// a função "fábrica" que retorna uma nova instância (com o seu "this" único) para se poder consumir
return function(seletor) {
return new $_$_proto(seletor);
}
})();
console.log($_$('.teste').buscarTags()); // ["div", "p"]
<div class="teste">Uma div</div>
<p class="teste">Um p</p>