Есть ли эквивалент __repr__ для javascript?

Ближе всего я добрался до чего-то близкого к Python repr:

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

Есть ли способ представить object как строку по умолчанию? Или мне нужно просто использовать object.variable для получения результатов, которые я хочу?

Ответ 1

JSON.stringify, вероятно, самый близкий, который вы собираетесь получить от родных библиотек. Это не работает с объектами, но вы можете определить свой собственный код, чтобы обойти это. Я искал библиотеки, которые предоставляют эту функциональность, но ничего не нашел.

Ответ 2

console.log представление объекта Javascript может быть чрезмерно сложным, добавив метод inspect() к этому объекту

например:

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 ; }

- Спасибо 'Ciro Santilli'

Ответ 4

String(user)

Это лучшее, что я могу придумать. Я думаю, что другой альтернативой может быть поиск сторонней библиотеки, которая обрабатывает создание читаемой человеком презентации для объектов.

Ответ 5

Быстрый ярлык для меня заключается в том, чтобы обернуть значение с помощью литерала массива, например:

console.log([variable]);

Вывод в консоли разработчика браузера делает достаточно ясным, каков единственный элемент массива.

Снимок экрана консоли разработчика на Firefox

Ответ 6

Как сказал Эндрю Джонсон, JSON.stringify, вероятно, самый близкий, который вы можете получить из коробки.

Одной из общих стратегий для представления является выводный исполняемый код Python. Если вы хотите это сделать, lave (напротив eval) - хороший выбор.

Пример:

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}));

Выход (не такой элегантный, как я надеялся!):

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

Ответ 7

Это решение для NodeJS (не уверен насчет браузера). Как говорит https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_inspect_object_options, вы можете добавить inspect(depth, opts) в свой класс, и он будет вызван, когда вы console.log(user_class_instance);

Поэтому это должно сработать:

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

Ответ 8

Узел v6.6.0 ввел символ util.inspect.custom: это глобально зарегистрированный символ, доступный через Symbol.for('nodejs.util.inspect.custom'). Его можно использовать для объявления пользовательских функций проверки.

Вот пример использования с OP case:

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'