Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Usando métodos .call em class no ECS6

Olá pessoal,

estou com dúvidas com relação a sintaxe 'Class' do ECS6. Gostaria de fazer algo como:

class Users {
    constructor(nome, idade){
        this._nome = nome;
        this._idade = idade;
    }
}

class acoes {
    static salvar(objeto){
        console.log(objeto._nome)
    } 
}

let jose = new Users('jose', 25);
acoes.salvar(jose) // jose

Entretanto, acredito que não seja a forma convencional/usual de usar, afinal de contas estou passando o objeto inteiro para a class acoes acessar um atributo _restrito.

Estive lendo alguns artigos e cheguei a vê algo como:

acoes =  function() {
    salvar = function(this){
        console.log(this._nome)
    } 
}

let jose = new Users('jose', 25);
acoes.salvar.call(jose)

Usando call. Porém todos os exemplos disponíveis são anterior a sintase de class do ECS6

4 respostas

Mais um exemplo, desta vez usando bind:

class Pessoa {
    constructor(nome) {
        this.nome = nome;
    }
}

class exibeNome {
    static alert(){
        console.log(this.nome);
    }
}

let pessoa = new Pessoa('Salsifufu');

exibeNome.bind(pessoa).alert()

Olá, Joselânio. Tudo bem?

Aparentemente os código que você implementou funciona. Desculpa, eu não entendi sua dúvida, você pode explicar de um pouco melhor?

Ao executar o segundo exemplo temos como resposta:

Uncaught TypeError: exibeNome.bind(...).alert is not a function
    at <anonymous>:15:24

Entretanto se alterarmos para:

exibeNome.alert.call(pessoa)

Fica tudo certo. Mas eu gostaria de passar pessoa para exibeNome e não para o método alert. Gostaria de fazer algo como:

exibeNome.call(pessoa).alert()
solução!

Olá Joselânio,

Sinceramente não consegui entender qual seu objetivo. Os métodos call e apply (semelhante ao call) são usados para chamar funções definindo um determinado escopo para elas, ou seja, você consegue "setar" o valor de this dentro da sua função.

Exemplo:

function fn() {
  console.info(this);
}

// aqui "this" é igual a "window"
fn();

// aqui "this" é igual ao objeto com o username "Wagner"
fn.call({
  username: "Wagner"
});

Existe também o método apply que eu citei acima, ele faz exatamente a mesma coisa, porém a diferença é forma como você passa parametros para a função.

No método call você passa os argumentos separados por vírgula, dessa maneira

function fn() {
  var args = [].slice.call(arguments);
  console.info(args);
}

fn.call(this, "teste1", "teste2", "teste3");

Já com o método apply você passa os argumentos em um array, da seguinte maneira

function fn() {
  var args = [].slice.call(arguments);
  console.info(args);
}

fn.apply(this, ["teste1", "teste2", "teste3"]);

Agora voltando ao seu problema, a única coisa que consigo imaginar que você queira fazer, é isso

class Person {
    constructor(username) {
        this.username = username;
    }
}

class Actions {
    static displayName(){
        console.log(this.username);
    }
}

let username = new Person("Wagner");

Actions.displayName.call(username); // Wagner
Actions.displayName(username); // undefined

Veja que a saída para ambas as funções são diferentes, já que em uma setamos o valor de this e na outra não..

Isso é mais conceitual, é a maneira como você prefere passar os argumentos para sua função, e caso você queira/precise controlar o valor de this.

Att.