1
resposta

[Dúvida] Call não chama outro objeto?

No código desta aula, no Call é passado user e o this.nome e this.email:

function exibeMensagem(nome, email) {
 console.log(`usuário: ${nome}, email ${email}`)
}
 const user = {
 nome: 'Mariana',
 email: 'm@m.com',
 executaFuncao: function(fn) {
   fn.call(user, this.nome, this.email)
 }
}

user.executaFuncao(exibeMensagem) //usuário: Mariana, email m@m.com

O retorno compreendi tudo certinho. Agora se eu tento passar no call um outro objeto ele não funciona user2:

const user2 = {
 nome: 'Juliana',
 email: 'ju@m.com'
}

function exibeMensagem(nome, email) {
 console.log(`usuário: ${nome}, email ${email}`)
}
 const user = {
 nome: 'Mariana',
 email: 'm@m.com',
 executaFuncao: function(fn) {
   fn.call(user2, this.nome, this.email)
 }
}

user.executaFuncao(exibeMensagem) //usuário: Mariana, email m@m.com

Agora se eu usar o this dentro da função exibeMensagem ai sim funciona:

const user2 = {
 nome: 'Juliana',
 email: 'ju@m.com'
}

function exibeMensagem(nome, email) {
 console.log(`usuário: ${this.nome}, email ${this.email}`)
}
 const user = {
 nome: 'Mariana',
 email: 'm@m.com',
 executaFuncao: function(fn) {
   fn.call(user2, this.nome, this.email)
 }
}

user.executaFuncao(exibeMensagem) //usuário: Juliana, email ju@m.com

Mais assim eu não estaria passando os parametros e sim passando o contexto de outro objeto, e a dúvida é: como eu passaria como parametro um outro objeto? como está no exemplo 2:

const user2 = {
 nome: 'Juliana',
 email: 'ju@m.com'
}

function exibeMensagem(nome, email) {
 console.log(`usuário: ${nome}, email ${email}`)
}
 const user = {
 nome: 'Mariana',
 email: 'm@m.com',
 executaFuncao: function(fn) {
   fn.call(user2, this.nome, this.email)
 }
}

user.executaFuncao(exibeMensagem) //usuário: Mariana, email m@m.com
1 resposta

Olá Dayvson, tudo bem?

Peço desculpa pela demora para respondê-lo.

Pelo que entendi, você está com dificuldades em passar um objeto como parâmetro no método call. Na verdade, o método call é utilizado para definir o contexto de execução de uma função, ou seja, o valor de this dentro da função.

No exemplo que você citou, o objeto user2 é passado como contexto para a função exibeMensagem, mas os parâmetros this.nome e this.email ainda se referem ao objeto user. Por isso, o resultado exibido é referente ao objeto user e não ao objeto user2.

Se você quiser passar o objeto user2 como parâmetro para a função exibeMensagem, basta adicioná-lo como um terceiro parâmetro na chamada do método call, assim:

const user2 = {
  nome: 'Juliana',
  email: 'ju@m.com'
}

function exibeMensagem(nome, email, objeto) {
  console.log(`usuário: ${objeto.nome}, email ${objeto.email}`)
}

const user = {
  nome: 'Mariana',
  email: 'm@m.com',
  executaFuncao: function(fn) {
    fn.call(this, this.nome, this.email, user2)
  }
}

user.executaFuncao(exibeMensagem) //usuário: Juliana, email ju@m.com

Dessa forma, o objeto user2 é passado como terceiro parâmetro para a função exibeMensagem e pode ser acessado dentro da função através do parâmetro objeto.

Espero ter ajudado. Caso tenha mais alguma dúvida que queira discutir, referente a este tópico, estarei à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.