constructor - ¿Cómo puedo establecer el nombre del objeto de JavaScript que se devuelve en un console.log?
Entonces, primera pregunta aquí: por favor, sé amable.
Estoy trabajando en un proyecto bastante centrado en JavaScript con algunos otros desarrolladores de diversos antecedentes en programación que no son web y hemos decidido intentar usar métodos y propiedades públicas y privadas en nuestras pseudo-clases de JavaScript únicamente como una buena práctica de codificación (es decir, sabemos que no hay ninguna ventaja real o seguridad en ello)
Hemos experimentado con varias formas de hacer público y privado (es decir, usando variables y funciones con alcance local con métodos privilegiados para uso público) y actualmente nos hemos decidido por hacer que nuestros constructores de clases de JavaScript realmente devuelvan un objeto que representa únicamente su interfaz pública, ocultando efectivamente todo lo demás.
Aquí hay un ejemplo:
function MyObject()
{
var _this = this;
this._privateProperty = 'somevalue';
this._privateMethod = function()
{
// Do Something
}
this.public =
{
publicProperty : _this._privateProperty,
publicMethod : function(){ return _this.privateMethod() }
}
return this.public;
}
Lo cual, al ser instanciado e iniciado sesión en Chrome:
var obj = new MyObject();
console.log(obj);
Salidas :
> Object
> publicMethod: function (){ return _this.privateMethod() }
> publicProperty: "somevalue"
>__proto__: Object
Ahora a mi pregunta: Debido a que estamos devolviendo la interfaz pública desde el constructor como un nuevo objeto, cuando hagas console.log notarás que se identifica a sí mismo como > Object, mientras que si no devolvemos esa interfaz pública se identifica como > MyObject.
Idealmente, nos gustaría tener lo último mostrado para fines de depuración y sé cómo acceder al nombre "MyObject" del constructor con _this.constructor.name, pero no tengo idea de cómo configurarlo para que sea reconocido de esa manera.
¿Alguien sabe cómo configurar esto manualmente?
Nota:
Sé que esto es en cierto modo una bastardización de la convención de JavaScript y que estamos tratando de encajar un clavo cuadrado en un agujero redondo, pero encontramos que era una forma muy clara y legible de lograr lo que estábamos intentando hacer. Estoy abierto a sugerencias sobre cómo lograr esto con un diseño diferente, pero en última instancia busco una respuesta que se ajuste a nuestro diseño actual.
Respuesta #1
Deberías poder establecer la función 'toString' del obj. Por ejemplo.
obj.constructor.prototype.toString = function() { return "MyObject"; }
Esto hará que console.log muestre 'MyObject' en lugar de Object.
Respuesta #2
A pesar de los valientes esfuerzos de los miembros de mi equipo y de los usuarios muy serviciales de este sitio que ofrecieron soluciones, hemos decidido que este diseño es en última instancia inmantenible y, en su lugar, hemos optado por un diseño que es un poco menos obvio, pero que logra el mismo resultado.
function MyObject()
{
var _privateProperty = 'somevalue';
function _privateMethod()
{
// Do Something
}
// Public Interface
this.publicProperty = _privateProperty;
this.publicMethod = _privateMethod;
}
Con este enfoque, básicamente estamos haciendo que TODA propiedad y método sea privado por defecto, y al final de nuestras "clases" exponemos los que queremos que estén disponibles públicamente. Creo que la mayoría estaría de acuerdo en que esto sigue la convención normal de JavaScript mejor que nuestro diseño inicial, lo que con suerte significa que será más fácil de leer y mantener para otros.
Gracias de nuevo a quienes se tomaron el tiempo para intentar idear una solución.
