Os construtores em JavaScript também são diferentes de outros idiomas. Qualquer função chamada através da palavra -chave nova pode ser considerada como um construtor.
Dentro do corpo do construtor, isso aponta para o objeto recém -criado. Se não houver expressão de retorno exibida no corpo do construtor, retornaremos por padrão, ou seja, o objeto recém -criado.
A cópia do código é a seguinte:
function foo () {
this.bla = 1;
}
Foo.prototype.test = function () {
console.log (this.bla);
};
var test = new Foo ();
O código acima chama Foo como o construtor e aponta o protótipo do objeto recém -criado (__proto__) para foo.prototype.
Se definirmos a expressão retornada no construtor, o construtor retornará toda a expressão, mas essa expressão de retorno deve ser um objeto.
A cópia do código é a seguinte:
barra de função () {
retornar 2;
}
novo bar (); // um novo objeto
function test () {
this.value = 2;
retornar {
Foo: 1
};
}
novo teste (); // O objeto retornado
Se novo for omitido, a função não pode retornar um novo objeto.
A cópia do código é a seguinte:
function foo () {
this.bla = 1; // é definido no objeto global
}
Foo (); // indefinido
O exemplo acima também pode funcionar em alguns cenários, mas devido ao mecanismo de trabalho disso em JavaScript, isso apontará para o objeto global aqui.
Modelo de fábrica
Para poder usar a palavra -chave nova, o construtor terá que exibir um valor de retorno.
A cópia do código é a seguinte:
barra de função () {
var valor = 1;
retornar {
Método: function () {
valor de retorno;
}
}
}
Bar.prototype = {
Foo: function () {}
};
novo bar ();
Bar();
No exemplo acima, o efeito de chamar a barra de funções sem usar o novo é o mesmo, e um objeto recém -criado que contém o método do método será retornado, o que é na verdade um fechamento.
Uma coisa a observar aqui é que o novo bar () não retornará bar.prototype, mas será um objeto de protótipo do método de função dentro da expressão de retorno.
No exemplo acima, não há diferença de funcionalidade entre usar o novo ou não.
Crie novos objetos através do modo de fábrica
Muitas vezes, somos lembrados de não usar o novo, porque uma vez que você esqueça o uso dele causará erros.
Para criar um objeto, preferimos usar o padrão de fábrica e construir um novo objeto no padrão de fábrica.
A cópia do código é a seguinte:
function foo () {
var obj = {};
obj.value = 'blub';
var privado = 2;
obj.somemethod = function (value) {
this.value = value;
}
obj.getprivate = function () {
retornar privado;
}
retornar obj;
}
Embora o código de exemplo acima seja menos propenso a erros do que quando estiver usando novo e será mais conveniente ao usar variáveis privadas, existem algumas desvantagens:
Como os objetos do protótipo não podem ser compartilhados, é necessária mais memória.
Para alcançar a herança, o padrão de fábrica requer copiar todos os métodos de outro objeto ou usá -lo como um protótipo de um novo objeto.
Desistir da cadeia de protótipos é apenas para evitar o uso de novos, o que parece ser contrário ao espírito da linguagem JavaScript.
Resumir
Embora o uso de novos possa ser mais propenso a erros, esse não é um motivo para abandonar o uso de cadeias de protótipo. Quanto a qual método assumir no final, depende das necessidades do aplicativo. A melhor maneira é escolher um estilo e cumpri -lo.
Simplificando, o construtor é inicializar um objeto de instância e a propriedade Prototype do objeto herda um objeto de instância.