Nesta aula a query é isolada em uma função em um arquivo sepado. A estrutura é essa:
module.exports = function(){
this.lista = function(){
}
return this;
}
A minha dúvida é o que significa o this aqui. Pq ele é necessário?
Nesta aula a query é isolada em uma função em um arquivo sepado. A estrutura é essa:
module.exports = function(){
this.lista = function(){
}
return this;
}
A minha dúvida é o que significa o this aqui. Pq ele é necessário?
Olá, Leandro.
O this no JavaScript sempre depende! ;)
A questão é que quem chama os .js e as funções pode definir o this.
Então, resposta curta: o this, nesse caso, é um objeto criado pelo express-load.
Normalmente, num módulo NodeJS, ou seja, num arquivo .js carregado com o require(), o NodeJS força o this a ser o module.exports.
Por isso, no server.js, por exemplo, se você colocar o seguinte código:
// server.js
console.log(this == module.exports);
O resultado vai ser true.
Porém, há um detalhe: estamos usando o express-load para carregar o produtosBanco.js. Esse módulo não é carregado pelo NodeJS.
Vamos imprimir o this e a comparação de module.exports com this dentro da function:
module.exports = function(){
console.log("----------------");
console.log(this);
console.log(this == module.exports);
console.log("----------------");
this.lista = function(connection, callback){
connection.query('select * from livros', callback);
}
return this;
}
Ao iniciar o servidor, teremos:
----------------
{ fullpath: '/home/alexandre/programming/work/caelum/cursos/js-35/projeto/casadocodigo/infra/produtosBanco.js',
location: 'infra/produtosBanco',
name: 'produtosBanco' }
false
----------------
Servidor rodando
Ou seja, o this é esse objeto esquisito aí, com as propriedades fullpath, location e name e não o module.exports.
Quem definiu esse this? Foi o express-load, que carrega esse módulo na função into:
mod = mod.call(script, instance);
https://github.com/jarradseers/express-load/blob/master/lib/express-load.js#L241
O primeiro parâmetro do call é o this que queremos.
E esse script é criado pelo próprio express-load, na função then:
this.scripts.push({
fullpath: entity,
location: path.join(location, name),
name: name
});
https://github.com/jarradseers/express-load/blob/master/lib/express-load.js#L109
Mais pra frente na aula, no item Prototype e Data Access Object, modificamos o código para usar uma função construtora (ou produtora).
Obrigado pela explicação!