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!