Есть ли эквивалент __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'
Ответ 3
util.inspect
http://nodejs.org/api/util.html#util_util_inspect_object_options
const util = require('util');
console.log(util.inspect({ a: "0\n1", b: "c"}));
выход:
{ a: '0\n1', b: 'c' }
Ответ 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'