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 delprototype
Función.- Si la propiedad
prototype
la función no es un objeto (valores primitivos, como Number, String, Boolean, Undefined o Null), en suObject.prototype
se usaObject.prototype
.
- Si la propiedad
- 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):
- Crea un nuevo objeto vacío (sin propiedades)
- Establece el prototipo del nuevo objeto al valor de la propiedad "
prototype
" deC
- 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 enObject.prototype
y una propiedad delconstructor
señala de nuevo la funciónC
- 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.
- Nota: El valor predeterminado de
- Llama a la función
C
con ''this
'' establecido en el nuevo objeto y con los argumentos proporcionados. - 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]);