w3schools tipos operadores logicos funciones entendiendo comparacion asignacion javascript oop object new-operator

tipos - operadores logicos javascript w3schools



¿Cómo funciona el nuevo operador en JavaScript? (2)

Probablemente la parte menos entendida de JavaScript, al lado de la cadena de prototipos.

Entonces la pregunta es: ¿cómo ...

new dataObj(args);

... en realidad crea un objeto, y define su prototipo cadena / constructores / etc?

Lo mejor es mostrar una alternativa para comprender completamente esta palabra clave.


El new operador usa el método interno [[Construct]] , y básicamente hace lo siguiente:

  • Inicializa un nuevo objeto nativo
  • Establece el [[Prototype]] interno de este objeto, apuntando a la propiedad del prototype Función.
    • Si la propiedad prototype la función no es un objeto (valores primitivos, como Number, String, Boolean, Undefined o Null), en su Object.prototype se usa Object.prototype .
  • Después de crear el objeto, llama a la función, proporcionando al objeto como su valor this .
  • Si el valor de retorno de la función llamada es una primitiva, se devuelve el objeto creado internamente.
  • De lo contrario, si se devuelve un objeto, el objeto creado internamente se pierde.

Una implementación equivalente de lo que hace el new operador se puede expresar así (suponiendo que el método Object.create ECMAScript 5 esté disponible):

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


La expresión new C(arg1, arg2) :

Asumiendo que C es una función de JavaScript (de lo contrario se obtiene un error):

  1. Crea un nuevo objeto vacío (sin propiedades)
  2. Establece el prototipo del nuevo objeto al valor de la propiedad " prototype " de C
    • Nota: El valor predeterminado de prototype para una función es un objeto (creado automáticamente cuando se declara la función) con su prototipo establecido en Object.prototype y una propiedad del constructor señala de nuevo la función C
    • Nota: la terminología puede ser confusa. La propiedad llamada "prototipo" no es lo mismo que el prototipo del objeto. Solo las funciones tienen la propiedad llamada "prototipo", pero todos los objetos tienen un prototipo.
  3. Llama a la función C con '' this '' establecido en el nuevo objeto y con los argumentos proporcionados.
  4. Si llamar a la función C devuelve un objeto, este objeto es el resultado de la expresión. De lo contrario, el objeto recién creado es el resultado de la expresión.

Una alternativa a lo new en ECMAScript 5 sería usar el método Object.createObject incorporado.

new C(arg1, arg2) sería equivalente a:

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

JavaScript estándar no le permite establecer explícitamente el prototipo de un objeto, por lo que Object.createObject no se puede implementar en el idioma en sí. Algunas implementaciones lo permiten a través de la propiedad no estándar __proto__. En ese caso, la new C se puede simular así:

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