Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucas01andre

Funções em objetos

Recommended Posts

Olá pessoa, estou aprendendo JavaScript e quero aprender também boas práticas. Ao olhar de vocês, ao declarar uma função em um objeto é melhor usar a forma tradicional ou a arrow? Por que usar e quando usar uma das duas? Desde já agradeço a ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @lucas01andre, tudo bem?

 

25 minutos atrás, lucas01andre disse:

ao declarar uma função em um objeto é melhor usar a forma tradicional ou a arrow?

Depende! São instruções ligeiramente diferentes.

 

25 minutos atrás, lucas01andre disse:

Por que usar e quando usar uma das duas?

1 - Arrow functions não podem ser chamadas com new.

Exemplo válido:

function Cachorro( nome ) {
    this.nome = nome;
}

const cao = new Cachorro( 'Alfredo' );// construindo uma função

alert( cao.nome );// Alfredo

Exemplo inválido:

const Cachorro = name => {
    this.nome = nome;
}

const cao = new Cachorro( 'Alfredo' );// construindo uma função

// Uncaught TypeError: Cachorro is not a constructor
// Cachorro não é uma função construtora

Caso você não esteja familiarizado com OO, objetos, new, etc, você pode ignorar essa informação por enquanto.

 

2 - Mais importante: arrow functions lidam com o contexto de this de forma diferente na execução da função.

Como há muito material a respeito e o assunto pode ser um pouco mais extenso, deixo alguns links que certamente explicarão melhor do que eu sobre o assunto:

https://hackernoon.com/javascript-es6-arrow-functions-and-lexical-this-f2a3e2a5e8c4

https://medium.com/@raphalima8/arrow-functions-declaração-funcionamento-escopos-e-o-valor-de-this-9cb6449bca31

https://derickbailey.com/2015/09/28/do-es6-arrow-functions-really-solve-this-in-javascript/

https://udgwebdev.com/quando-nao-usar-arrow-functions/

 

Após a leitura, recomendo o estudo sobre o método bind(). Vai ajudar a entender melhor essa estória de "this".

Spoiler: arrow functions não são afetadas pelo bind(), enquanto as functions sim. Isso faz uma enorme diferença...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por janir.matheus
      Bom dia,
       
      Preciso de ajuda ajuda para resolver o problema de SIGSEGV, basicamente tennho um zconection dentro de uma classe e recebo erro quando tento acessá-lo. Segue um trecho da classe:
      unit unt_classconexao; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ZConnection, ZDataset; type { tConexao } tConexao = class private public vConector : TZConnection; function Listar_Usuarios:TZReadOnlyQuery; procedure Conectar_Banco; end; implementation { tConexao } function tConexao.Listar_Usuarios: TZReadOnlyQuery; var zrquery : TZReadOnlyQuery; begin Conectar_Banco; try zrquery := TZReadOnlyQuery.Create(nil); zrquery.Connection := vConector; zrquery.SQL.Clear; zrquery.SQL.Text := 'SELECT * from tbl_profissionais'; zrquery.Open; Listar_Usuarios := zrquery; finally end; end; procedure tConexao.Conectar_Banco; begin //vConector := TZConnection.Create(nil); vConector.HostName := 'localhost'; vConector.Port := 3306; vConector.Database := 'Caps'; vConector.Protocol := 'mysql-5'; vConector.User := 'root'; vConector.Password := ''; vConector.Connected := true; end; end. Após isso tento fazer uso dessa classe para popular um DBGrid:
      unit unt_frmprincipal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, Menus, DBGrids, ZConnection, unt_classconexao; type { Tfrm_principal } Tfrm_principal = class(TForm) DataSource1: TDataSource; DBGrid1: TDBGrid; MainMenu_frmPrincipal: TMainMenu; MenuItem_AplicativoSair: TMenuItem; N1: TMenuItem; MenuItem_AplicativoLogin: TMenuItem; MenuItem_Aplicativo: TMenuItem; procedure MenuItem_AplicativoLoginClick(Sender: TObject); private public vConexao : tConexao; end; var frm_principal: Tfrm_principal; implementation {$R *.lfm} { Tfrm_principal } procedure Tfrm_principal.MenuItem_AplicativoLoginClick(Sender: TObject); begin //vConexao := tConexao.Create; DataSource1.DataSet := vConexao.Listar_Usuarios; end; end. A mensagem de erro que recebo dá a entender que o problema ocorre logo que o zconnection começa a ser configurado, como vocês podem ver pelos trechos comentados eu tentei instanciar o componente também sem sucesso. Não tenho experiencia com POO e tenho certeza que estou cometendo um erro bobo, então peço uma explicação sobre como resolver isso. Agradeço de antemão a quem puder me ajudar.
       
      PS. Estou usando o Lazarus.
    • Por Giovanird
      Olá a todos!

      Abaixo lista minha estrutura em Json. Há grupos que faltam um objeto (TIPO) e ao listar recebo o erro  por não encontrá-lo.
      Existe alguma maneira de verificar se este objeto existe e caso não, ignorar?

      Desde já agradeço a atenção.

       
      ESTUTURA JSON: [ { “titulo”: “JSON”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: novo }, { “titulo”: “HTML”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: usado }, { “titulo”: “PHP”, “data”: “20/10/2020”, “ano”: 2020 } ] CAPTURANDO OS DADOS: $titulo = $decode->titulo; $data = $decode->data; $ano = $decode->ano; $tipo = $decode->tipo;  
       
    • Por vinicius59
      Então... há algum tempo venho pesquisando em vários sites sobre a duvida que eu tenho, ela se consiste em como eu posso fazer (2 botoes) que ao ser acionado cria-se um quadrado pequeno de uma cor que eu vou escolher! Se alguém poder responder 'Me desculpem se essa duvida não for relacionada ao php sou novo aqui'.
    • Por Lucas Natan Cavichioli
      Boa noite galera, estou com uma dificuldade de lógica aqui.. rsrs. Estou consultando uma api de cnpj. Ele me traz um array que contém valores simples e alguns objetos
      exemplo:   
      "atividade_principal": [ { "text": "Atividades de televisão aberta", "code": "60.21-7-00" } ], "data_situacao": "03/11/2005", "nome": "GLOBO COMUNICACAO E PARTICIPACOES S/A", "uf": "RJ", "telefone": "(21) 2540-2623", "atividades_secundarias": [ { "text": "Reprodução de vídeo em qualquer suporte", "code": "18.30-0-02" }, { "text": "Portais, provedores de conteúdo e outros serviços de informação na internet", "code": "63.19-4-00" }, { "text": "Agenciamento de espaços para publicidade, exceto em veículos de comunicação", "code": "73.12-2-00" }, { "text": "Programadoras", "code": "60.22-5-01" } ] ....  
      .... $var = json_decode($json);            // Bloco de código: Seta todos os valores da api menos o cnpj         //define delimitador do foreach em 0.         $jafoi = 0;         $receitawsmodel = new Receitaws();                 foreach($var as $valor){                         if($jafoi == 0){                               foreach($var->atividade_principal as $valor){                                 $receitawsmodel->setRec_atv_prin_code($valor->code);                                 $receitawsmodel->setRec_atv_prin_text($valor->text);                             }                             foreach($var->atividades_secundarias as $valor){                                 var_dump($valor);                                 $array = array($valor->code, $valor->text);                                                                  var_dump($array);                                //aqui eu setava o array com todos os valores tipo: $receitawsmodel->setRec_atv_secundarias($str);                             }                                             $jafoi = 1;                         }                      } .... Tenho que armazenar essas informações no banco. No meu php está assim:
      O primeiro foreach, da certo, pois todo cnpj vai ter apenas uma atividade principal, porém, no segundo foreach a atividade secundária pode ter varios ou nenhuma. 
      Eu criei uma variavel "$jafoi" como um delimitador pra mim conseguir separar os objetos dos valores simples dentro do array. Como está ali eu crio 4 arrays(óbvio porque ele tem 4 atividades secundárias), gostaria de alguma ideia de como eu poderia fazer para que eu juntasse tudo isso em um array só e usasse um implode pra armazenar uma string com todos esses valores.
      Alguém pode me ajudar?
    • Por jadsonlucena
      Galera, estou precisando criar uma variável do tipo object que poderá instanciar outros tipos que à herdam.
      #include <iostream> #include <cstdlib> class Animal { public: char *nome; Animal (char *nome) { this->nome = nome; } }; class Cachorro : public Animal { public: bool enterraOsso; Cachorro (char* nome, bool enterraOsso) : Animal(nome) { this->enterraOsso = enterraOsso; } }; class Passaro : public Animal { public: bool voar; Passaro (char* nome, bool voar) : Animal(nome) { this->voar = voar; } }; int main() { Animal *animal; animal = new Cachorro("Scooby", true); std::cout << animal->nome << ", " << animal->enterraOsso << std::endl; animal = new Passaro("Piopio", false); std::cout << animal->nome << ", " << animal->voar << std::endl; return 0; } A ideia é que a partir da variável da class super eu poderia acessar os atributos da subclass também.
      Não sei se isto é cast ou polimorfismo. No java sei que é possível, mas não estou conseguindo fazer em c++.
       
      Grato desde já pela ajuda de todos....
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.