que tal cronos!
en la observacion que haces, sucede por dos factores: todos los tipos de datos de javascript tiene un wrapper, y debido a que devuelves el valor
this en el prototipo en la consola observaras que obtienes un objeto. el primer factor consiste en que automaticamente javascript envuelve los tipos de datos con un objeto de acuerdo a su tipo. por esa razon es posible invocar metodos directamente desde el valor aunque no se haya realizado estrictamente una instancia desde el constructor. me refiero por ejemplo,
Código:
"string".toUpperCase();
(new String("string")).toUpperCase();
(127).toString(16);
(new Number(127)).toString(16);
sin embargo, es naturaleza de javascript que al momento de imprimir el valor primitivo automaticamente invoca el metodo
valueOf de ese wrapper. de modo que en lugar de mostrar el string
[object Object] se imprime el valor. prueba a invocar el metodo
valueOf cuando el string es devuelto como
[object Object] y veras que obtienes el string real. en el caso de String, debe ser porque estas devolviendo el objeto en si (this). de todos modos, no es algo que sucede en todos los constructores, considera por ejemplo Number.
Código:
Object.prototype.that = function(){
return this;
};
console.log("string".that());
console.log("string".that().valueOf());
console.log((10).that()); // no muestra [object Object] ;
console.log((10).that().valueOf());