¿Hay un __repr__ equivalente para javascript?

Lo más cercano a algo cercano a la reproducción de Python es esto:

function User(name, password){ this.name = name; this.password = password; } User.prototype.toString = function(){ return this.name; }; var user = new User('example', 'password'); console.log(user.toString()) // but user.name would be even shorter 

¿Hay una manera de representar un object como una cadena por defecto? ¿O voy a tener que usar solo object.variable para obtener los resultados que quiero?

JSON.stringify es probablemente lo más cerca que se obtendrá de las bibliotecas nativas. No funciona bien con los objetos, pero podría definir su propio código para solucionarlo. Busqué bibliotecas que proporcionen esta funcionalidad pero no encontré nada.

console.log representación de console.log de un objeto de Javascript se puede anular agregando el método inspect() a ese objeto

p.ej:

 function User(name, password){ this.name = name; this.password = password; } User.prototype.toString = function(){ return this.name; }; User.prototype.inspect = function(){ return 'Model: ' + this.name ; } 

-Gracias a ‘ciro santilli’

util.inspect

http://nodejs.org/api/util.html#util_util_inspect_object_options

 var util = require('util'); console.log(util.inspect({ a: "0\n1", b: "c"})); 

salida:

 { a: '0\n1', b: 'c' } 
 String(user) 

Es lo mejor que se me ocurre. Creo que otra alternativa puede ser encontrar una biblioteca de terceros que maneje la creación de presentaciones legibles para objetos.

Un atajo rápido para mí es envolver el valor con una matriz literal, como esta:

 console.log([variable]); 

La salida en la consola de desarrollo del navegador deja bastante claro cuál es el único elemento de la matriz.

Captura de pantalla de la consola de desarrollador en Firefox.

Como dijo Andrew Johnson, JSON.stringify es probablemente lo más cerca que puede salir de la caja.

Una estrategia común para una reproducción es generar código Python ejecutable . Si desea hacer esto, lave (opuesto a eval ) es una buena opción.

Ejemplo:

 var escodegen = require('escodegen') var lave = require('lave') function User(name, password){ this.name = name; this.password = password; } var user = new User('example', 'password'); console.log(lave(user, {generate: escodegen.generate})); 

Salida (no tan elegante como esperaba!):

 var a = Object.create({ 'constructor': function User(name, password){ this.name = name; this.password = password; } }); a.name = 'example'; a.password = 'password'; a; 

Esta es la solución para NodeJS (no estoy seguro acerca del navegador). Como https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_inspect_object_options , puede agregar inspect(depth, opts) a su clase y se llamará cuando usted console.log(user_class_instance);

Por lo tanto, esto debería hacer el truco:

 User.prototype.inspect = function(depth, opts){ return this.name; }; 

El nodo v6.6.0 introdujo el símbolo util.inspect.custom : es un símbolo registrado globalmente accesible a través de Symbol.for('nodejs.util.inspect.custom') . Se puede utilizar para declarar funciones de inspección personalizadas.

Aquí hay un ejemplo de uso con el caso de OP:

 function User(name, password){ this.name = name; this.password = password; this[Symbol.for('nodejs.util.inspect.custom')] = () => this.name; } var user = new User('example', 'password'); console.log(user) // 'example'