Como o novo operador trabalha em JavaScript?

Provavelmente a parte menos compreendida do JavaScript, ao lado da cadeia de protótipos.

Então a questão é: como é …

new dataObj(args); 

… realmente criar um object e definir seu protótipo de cadeia / construtores / etc?

O melhor é mostrar uma alternativa, para entender completamente essa palavra-chave.

O new operador usa o método interno [[Construct]] e basicamente faz o seguinte:

  • Inicializa um novo object nativo
  • Define o [[Prototype]] interno deste object, apontando para a propriedade prototype da function.
    • Se a propriedade prototype da function não for um object (valores primitivos, como Number, String, Boolean, Undefined ou Null), Object.prototype será usado.
  • Depois de criar o object, ele chama a function, fornecendo o object como seu valor.
  • Se o valor de retorno da function chamada for uma primitiva, o object criado internamente será retornado.
  • Caso contrário, se um object for retornado, o object criado internamente será perdido.

Uma implementação equivalente do que o new operador faz, pode ser expressa assim (assumindo que o método ECMAScript 5 Object.create esteja disponível):

 function NEW(f) { var obj, ret, proto; // Check if `f.prototype` is an object, not a primitive proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype; // Create an object that inherits from `proto` obj = Object.create(proto); // Apply the function setting `obj` as the `this` value ret = f.apply(obj, Array.prototype.slice.call(arguments, 1)); if (Object(ret) === ret) { // the result is an object? return ret; } return obj; } // Example usage: function Foo (arg) { this.prop = arg; } Foo.prototype.inherited = 'baz'; var obj = NEW(Foo, 'bar'); obj.prop; // 'bar' obj.inherited; // 'baz' obj instanceof Foo // true 

A expressão new C(arg1, arg2) :

Assumindo C é uma function JavaScript (senão você recebe um erro):

  1. Cria um novo object vazio (sem propriedades)
  2. Define o protótipo do novo object para o valor da propriedade ” prototype ” de C
    • Nota: O valor padrão de prototype para uma function é um object (criado automaticamente quando a function é declarada) com seu protótipo configurado como Object.prototype e uma propriedade de constructor apontando de volta para a function C
    • Nota: A terminologia pode ser confusa. A propriedade denominada “prototype” não é igual ao protótipo do object. Apenas funções têm a propriedade chamada “prototype”, mas todos os objects possuem um protótipo.
  3. Chama a function C com ‘ this ‘ definida para o novo object e com os argumentos fornecidos.
  4. Se chamar a function C retornar um object, esse object será o resultado da expressão. Caso contrário, o object recém-criado é o resultado da expressão.

Uma alternativa ao new no ECMAScript 5 seria usar o método Object.createObject Object.createObject .

new C(arg1, arg2) seria equivalente a:

 var obj = Object.createObject(C.prototype); C.apply(obj, [arg1, arg2]); 

O JavaScript padrão não permite que você defina explicitamente o protótipo de um object, portanto, Object.createObject não pode ser implementado no próprio idioma. Algumas implementações permitem isso através da propriedade não padrão __proto__. Nesse caso, o new C pode ser simulado assim:

 var obj = {}; obj.__proto__ = C.prototype; C.apply(obj, [arg1, arg2]);