JavaScript orientado a objeto (OOJS) 3 maneiras de criar instâncias de objeto
Quando uma linguagem de programação é tudo sobre objetos, a primeira coisa que precisamos aprender é como criar objetos. Criar objetos em JavaScript é bastante fácil: um par de chaves vai fazer o trabalho, no entanto, isso é nem o único caminho para criar um objeto nem o único caminho você precisará usar.
Em JavaScript, as instâncias de objeto são criado a partir de objetos internos e vem à existência quando o programa está sendo executado. Por exemplo, Encontro
é um objeto interno que nos fornece informações sobre datas. Se quisermos mostrar a data atual em uma página, nós precisa de uma instância de tempo de execução de Encontro
que carrega as informações sobre a data atual.
JavaScript também nos permite definir nossos próprios objetos que podem produzir suas próprias instâncias de objetos em tempo de execução. Em JavaScript, tudo é um objeto e todo objeto tem um antepassado final chamado Objeto
. A criação de uma instância de objeto é chamada instanciação.
1. O Novo
operador
Um dos métodos mais comuns e conhecidos para criar uma nova instância de objeto é usando o Novo
operador.
Você precisa de um construtor para tornar o Novo
trabalho do operador. Um construtor é um método de um objeto que reúne um nova instância desse objeto. Sua sintaxe básica é assim:
novo construtor ()
Um construtor pode aceitar argumentos que pode ser usado para alterar ou adicionar propriedades à instância do objeto que ele constrói. O construtor tem o mesmo nome como o objeto a que pertence.
Aqui está um exemplo de como criar um instância do Encontro()
objeto com o Novo
palavra chave:
dt = new Data (2017, 0, 1) console.log (dt) // Dom Jan 01 2017 00:00:00 GMT + 0100
Encontro()
é o construtor para criar um novo Encontro
objeto. Construtores diferentes para um objeto pegar argumentos diferentes para criar o mesmo tipo de instâncias de objeto com atributos variados.
Nem todos os objetos internos em JavaScript podem ser instanciados como Encontro
. Existem objetos que não vem com um construtor: Matemática
, JSON
e Refletir
, mas eles ainda são objetos comuns.
Entre os objetos internos que possuem construtor (es), Símbolo
não pode ser chamado no estilo do construtor para instanciar um novo Símbolo
instância. Só pode ser chamado como uma função que retorna um novo Símbolo
valor.
Além disso, entre os objetos internos que possuem o (s) construtor (es), nem todos precisam que seus construtores sejam chamados com o (s) construtor (es). Novo
operador, a fim de ser instanciado. Função
, Matriz
, Erro
, e RegExp
também pode ser chamado como funções, sem usar o Novo
palavra-chave, e eles irão instanciar e retornar uma nova instância de objeto.
2. O Refletir
objeto
Os programadores de back-end podem já estar familiarizados com APIs de reflexão. Reflexão é uma característica das linguagens de programação inspecionar e atualizar algumas das entidades básicas, como objetos e classes, em tempo de execução.
Em JavaScript, você já pode executar alguns operações de reflexão usando Objeto
. Mas um API de reflexão adequada eventualmente veio a existir em JavaScript também.
o Refletir
objeto tem um conjunto de métodos para criar e atualizar instâncias de objetos. o Refletir
objeto não tem um construtor, por isso não pode ser instanciado com o Novo
operador, e, assim como Matemática
e JSON
, isto não pode ser chamado como uma função ou.
Contudo, Refletir
tem um equivalente do Novo
operador: a Reflect.construct ()
método.
Reflect.construct (target, argumentsList [, newTarget])
Tanto o alvo
e o opcional newTarget
argumentos são objetos tendo seus próprios construtores, enquanto argumentsList
é um lista de argumentos para ser passado para o construtor de alvo
.
var dt = Reflect.construct (Data, [2017, 0, 1]); console.log (dt); // dom Jan 01 2017 00:00:00 GMT + 0100
O código acima tem o mesmo efeito como instanciando Encontro()
usando o Novo
operador. Embora você ainda possa usar Novo
, Reflexão é uma Padrão ECMAScript 6. Também permite que você fazer uso do newTarget
argumento, que é outra vantagem sobre o Novo
operador.
O valor de newTarget
's protótipo (para ser exato, é o protótipo de newTarget
construtor) torna-se o protótipo da instância recém-criada.
Um protótipo é o propriedade de um objeto, cujo valor é também um objeto, carregando as propriedades do objeto original. Em suma, um objeto recebe seus membros do seu protótipo.
Aqui, vamos ver um exemplo:
classe A construtor () this.message = função () console.log ('mensagem de A') classe B constructor () mensagem () console.log ('mensagem de B') data () console.log ('dados de B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // message from A console.log (obj.data ()); // dados do B console.log (obj instanceof B) // true
Passando B
como o terceiro argumento para Reflect.construct ()
, o valor protótipo do obj
objeto é feito para ser o mesmo como o protótipo de B
construtor (que tem as propriedades mensagem
e dados
).
portanto, obj
pode acessar o mensagem
e dados
, disponível em seu protótipo. Mas desde obj
é feito usando UMA
, também tem o seu próprio mensagem
isto Recebido de UMA
.
Apesar de obj
é construído como uma matriz, é não é um exemplo de Matriz
, porque o seu protótipo está configurado para Objeto
.
obj = Reflect.construct (Matriz, [1,2,3], Objeto) console.log (obj) // Matriz [1, 2, 3] console.log (obj instanceof Array) // false
Reflect.construct ()
pode ser útil quando você deseja criar um objeto usando mais de um modelo.
3. O Object.create ()
método
Você também pode criar um novo objeto comum com um protótipo específico através da Object.create ()
. Isso também pode parecer muito semelhante ao uso do Novo
operador, mas não é.
Object.create (O [, propertiesObject])
o O
argumento é um objeto que serve o protótipo para o novo objeto que será criado. O opcional propertiesObject
argumento é um lista de propriedades você pode querer adicionar ao novo objeto.
classe A construtor () mensagem () console.log ('mensagem de A') var obj = Object.create (novo A (), dados: gravável: verdadeiro, configurável: verdadeiro, valor: function () retornar 'dados de obj') console.log (obj.message ()) // mensagem de A console.log (obj.data ()) // dados de obj obj1 = Object.create ( novo A (), foo: gravável: verdadeiro, configurável: verdadeiro, valor: função () retorno 'foo de obj1') console.log (obj1.message ()) // mensagem de Um console. log (obj1.foo ()) // foo de obj1
No obj
objeto, a propriedade adicionada é dados
, enquanto em obj1
, Está foo
. Então, como você vê, nós podemos ter propriedades e métodos adicionados a um novo objeto.
Isso é ótimo quando você quer criar vários objetos do mesmo tipo mas com diferentes propriedades ou métodos suplementares. o Object.create ()
sintaxe salva o problema de codificar todos eles separadamente.