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

Duvidas sobre objeto em JavaScript

estou acompanhando o curso de JavaScript avançado I, e na aula 2 atividade 8, o professor comentou sobre essa classe: class Negociacao {

constructor(data, quantidade, valor) {

this._data = new Date(data.getTime()); this._quantidade = quantidade; this._valor = valor; Object.freeze(this);

} var n1= new Negociacao(new Date(),5,10);

colocando no console do navegador n1._quantidade ele disse que _quantidade também era um objeto porque ele possui métodos, sendo que quando coloco typeof para verificar o tipo ele me retorna Number que e o tipo numero pois o valor dentro dessa variável e 5 e não um object,sei que em JS quase tudo e um objeto,mas minha duvida e nesse caso e o _quantidade realmente e um objeto,ou seria uma propriedade e houve alguma confusão?

10 respostas

Em JavaScript tudo é objeto, inclusive função. Faça assim no console do Chrome:

let i = 10

Depois escreva i. que o Chrome vai autoconpletar com todos os métodos que Number possui.

Na explicação _quantidade é uma propriedade que guarda uma instancia de Number, um objeto.

Não houve confusão.

Ficou claro agora? Lembre-se que objeto é dotado de dado e comportamento. (Apesar de muita gente criar objetos que possuem apenas dados)

Se não ficou claro eu dou mais exemplos para você fixar.

Muito obrigado pela resposta do senhor,só pra fixar melhor, no caso o _quantidade e um objeto porque o valor Number também e considerado um objeto na linguagem JS? pois vi uma informação que 5 tipos primitivos que não são objetos na linguagem: numérico, string, booleano, null e undefined,se eu estiver errado por favor me corrija,agradeço novamente a atenção que o senhor tem dado

solução!

Não há tipo primitivo em JavaScript apesar de usarem esse termo incorretamente. O termo correto é tipo literal.

A exceção é para null e indefined.

Como eu já provei para você, let i = 10 é um objeto. Essa declaração é a literal para let i = new Number(10);

A forma literal é um atalho. Mas essa última forma não pega o cache de números (outra coisa mais complexa que não vem ao caso).

Existe new Boolean (), new String(), mas usamos a forma literal que é mais simples e que usam cache via flyweight.

Como você provou para você no console do Chrome, let i = 10 guarda um objeto.

Para leigos ou quem está começando em JavaScript dizer que são primitivos é mais fácil para explicar.

O teste vale mais que 1000 palavras. Se fosse primitivo não teriam métodos. No caso, pode dizer que há primitivos encapsulados por objetos se isso for melhor para você.

Você me disse que String é primitivo, certo? Então como String possuiu métodos como replace e trim? Ficou ainda mais claro?

Use o termo tipo literal em vez de tipo primitivo.

Muito obrigado professor Flavio,ficou mais claro :)

Eu sei que sua dúvida foi fruto a partir de pesquisas. Mas JavaScript é cheio dos detalhes mesmo.

Mas se vc falar primitivo todos vão entender, se falar literal também.

Para completar, no livro JavaScript Goodparts ele fala desse detalhe. O autor é Douglas CrockFord. Tem em português.

Sucesso e bom estudo meu aluno.

Oi Alison! Estou de volta. Para ficar ainda mais claro o motivo de usarem o termo primitivo e não esta errado (apesar do ideal é o uso do termo literal).

O tipos que começam em minúsculo equivalem a declaração literal. Vejamos um exemplo:

let nome = 'Flávio';
let idade = 20.;

Até segunda ordem, guardam um primitivo em memória. O que é um tipo primitivo. Aquele que só guarda dado e não tem comportamento nenhum.

Mas se chamarmos um método em nome e em idade, vai funcionar:

let nome = 'Flávio';
nome = nome.replace(/vio/, 'vião');
let idade = 20.10;
let idadeParaString = idade.toFixed(2);

Se são primitivos, como podemos chamar métodos? Congela aqui, agora vamos para outra explicação.

JavaScript permite criar strings e números não como literais, mas como objetos:

let nome = new String('Flávio');
console.log(typeof(nome)); // Object
let idade = new Number(20);
console.log(typeof(idade)); // Object

Esses possuem método e se comportam como nossos literais. Mas qual a diferença?

Os tipos string e number são literais e guardam um valor primitivo. Contudo, se tentarmos chamar algum método em variáveis declaradas com esses tipos, eles são empacotados automaticamente (auto-boxing) por String e Number respectivamente.

É por isso que esse código funciona:

let nome = 'Flávio';
nome.replace('/vio/', 'vião'); // faz auto-boxing, por debaixo dos panos faz algo como new String('Flávio');

Então, na prática, usamos a declaração literal porque é mais fácil e rápida, mas o JavaScript se encarrega em promover os primitivos para seu respectivo tipo objeto.

Acho que com isso mata a charada toda.

Há um detalhe sutil ainda nos dois tipos. Se fizemos:

let nome = 'Flávio';

Não conseguimos adicionar propriedades dinamicamente em nome, mesmo se ele sofrer autoboxing.

let nome = 'Flávio'
nome.teste = 10;
console.log(nome.teste); // undefined

Mas se criarmos com new String() podemos:

let nome = new String('Flávio');
nome.teste = 10;
console.log(nome.teste)// imprime 10!

Sucesso bom estudo.

Nossa,agora clareou ainda mais,entendi o que o JS faz por debaixo dos panos,professor Flavio muito obrigado novamente pela paciência e explicação