La raíz de su confusión es la forma en que Chrome representa objetos en su consola.
La expresión new f()
en su ejemplo se representa como 'f
' en la salida de la consola del cromo, pero sólo como un mero "conveniencia" de esta consola en particular, por ejemplo, el registro de la siguiente objeto:
({constructor: function Foo(){}});
Mostrará que se representa como "Foo
". Básicamente, la consola intenta encontrar una representación cuyo constructor su objeto es instancia de.
Entonces, la consola muestra f
, pero no está registrando la función, el operador new
produce un objeto que hereda de f.prototype
.
Usted está devolviendo 10
de la función, pero como se le llama con new
, y el tipo de retorno es una primitiva , se descarta el valor, el objeto de nueva creación que hereda se devuelve forma f.prototype
.
Por ejemplo:
var F = function() { return 10; };
F.prototype.inherited = 'foo';
var h = new F(); // the 10 returned is ignored
h instanceof F; // true
h.inherited; // "foo"
Por otro lado, si usted devuelve un objeto a partir de un constructor, la instancia del objeto que el operador new
crea detrás del scened (y hereda desde el prototipo del constructor) se perderán , por ejemplo:
var F = function() { return {}; };
F.prototype.inherited = 'foo';
var h = new F(); // the empty object is returned
h instanceof F; // false
h.inherited; // undefined
Sí, new f;
y new f();
son completamente equivalentes, aunque las personas que recomiendan el uso de los paréntesis para añadir claridad a su código.
posible duplicado de [¿Cuál es la palabra clave 'nueva' en JavaScript?] (Http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) –