Можно ли переопределить функцию toString () JavaScript, чтобы обеспечить значимый вывод для отладки?
Когда Я console.log() объект в моей программе JavaScript, я просто вижу выход [object Object], что не очень полезно для выяснения того, какой объект (или даже какой тип объекта) это.
В C# я привык к переопределению ToString() чтобы иметь возможность настроить представление отладчика объекта. Есть ли что-нибудь подобное, что я могу сделать в JavaScript?
12 ответов:
можно переопределить
toStringв Javascript, а также. См. пример:function Foo() { } // toString override added to prototype of Foo class Foo.prototype.toString = function() { return "[object Foo]"; } var f = new Foo(); alert(f); // popup displays [object Foo]посмотреть этой обсуждение того, как определить имя типа объекта в JavaScript.
сначала переопределить
toStringдля вашего объекта или прототипа:var Foo = function(){}; Foo.prototype.toString = function(){return 'Pity the Foo';}; var foo = new Foo();затем преобразовать в строку, чтобы увидеть строковое представление объекта:
//using JS implicit type conversion console.log('' + foo);Если вам не нравится дополнительный ввод, вы можете создать функцию, которая записывает строковые представления своих аргументов в консоль:
var puts = function(){ var strings = Array.prototype.map.call(arguments, function(obj){ return '' + obj; }); console.log.apply(console, strings); };использование:
puts(foo) //logs 'Pity the Foo' puts(foo, [1,2,3], {a: 2}) //logs 'Pity the Foo 1,2,3 [object Object]'обновление
E2015 предоставляет гораздо более приятный синтаксис для этого материала, но вам придется использовать транспилер, например Бабель:
// override `toString` class Foo { toString(){ return 'Pity the Foo'; } } const foo = new Foo(); // utility function for printing objects using their `toString` methods const puts = (...any) => console.log(...any.map(String)); puts(foo); // logs 'Pity the Foo'
простой способ получить отладочный вывод в браузере JS - это просто сериализовать объект в JSON. Так что вы могли бы сделать звонок, как
console.log ("Blah: " + JSON.stringify(object));Так, например,
alert("Blah! " + JSON.stringify({key: "value"}));выдает оповещение с текстомBlah! {"key":"value"}
просто переопределить
toString()метод.простой пример:
var x = {foo: 1, bar: true, baz: 'quux'}; x.toString(); // returns "[object Object]" x.toString = function () { var s = []; for (var k in this) { if (this.hasOwnProperty(k)) s.push(k + ':' + this[k]); } return '{' + s.join() + '}'; }; x.toString(); // returns something more usefulоно даже лучше, когда вы определяете новый тип:
function X() { this.foo = 1; this.bar = true; this.baz = 'quux'; } X.prototype.toString = /* same function as before */ new X().toString(); // returns "{foo:1,bar:true,baz:quux}"
если вы используете узел, возможно, стоит рассмотреть
util.inspect.var util = require('util') const Point = { x: 1, y: 2, [util.inspect.custom]: function(depth) { return `{ #Point ${this.x},${this.y} }` } } console.log( Point );это даст:
{ #Point 1,2 }в то время как версия без проверки отпечатков:
{ x: 1, y: 2 }
Если объект определен самостоятельно, вы всегда можете добавить переопределение toString.
//Defined car Object var car = { type: "Fiat", model: 500, color: "white", //.toString() Override toString: function() { return this.type; } }; //Various ways to test .toString() Override console.log(car.toString()); console.log(car); alert(car.toString()); alert(car); //Defined carPlus Object var carPlus = { type: "Fiat", model: 500, color: "white", //.toString() Override toString: function() { return 'type: ' + this.type + ', model: ' + this.model + ', color: ' + this.color; } }; //Various ways to test .toString() Override console.log(carPlus.toString()); console.log(carPlus); alert(carPlus.toString()); alert(carPlus);
class Foo { toString() { return 'I am foo'; } } const foo = new Foo(); console.log(`${foo}`); // 'I am foo'
вы можете дать любому пользовательскому объекту свои собственные методы toString или написать общий, который вы можете вызвать для объекта, на который вы смотрите -
Function.prototype.named= function(ns){ var Rx= /function\s+([^(\s]+)\s*\(/, tem= this.toString().match(Rx) || ""; if(tem) return tem[1]; return 'unnamed constructor' } function whatsit(what){ if(what===undefined)return 'undefined'; if(what=== null) return 'null object'; if(what== window) return 'Window object'; if(what.nodeName){ return 'html '+what.nodeName; } try{ if(typeof what== 'object'){ return what.constructor.named(); } } catch(er){ return 'Error reading Object constructor'; } var w=typeof what; return w.charAt(0).toUpperCase()+w.substring(1); }
вместо переопределения
toString(), Если вы включите Прототип Библиотеки JavaScript, вы можете использоватьObject.inspect()чтобы получить гораздо более полезное представление.большинство популярных фреймворков включают нечто подобное.
вы можете расширить или переопределить в JS
String.prototype.toString = function() { return this + "..." } document.write("Sergio".toString());
A simple format Date function using Javascript prototype, it can be used for your purpose https://gist.github.com/cstipkovic/3983879 : Date.prototype.formatDate = function (format) { var date = this, day = date.getDate(), month = date.getMonth() + 1, year = date.getFullYear(), hours = date.getHours(), minutes = date.getMinutes(), seconds = date.getSeconds(); if (!format) { format = "MM/dd/yyyy"; } format = format.replace("MM", month.toString().replace(/^(\d)$/, '0')); if (format.indexOf("yyyy") > -1) { format = format.replace("yyyy", year.toString()); } else if (format.indexOf("yy") > -1) { format = format.replace("yy", year.toString().substr(2, 2)); } format = format.replace("dd", day.toString().replace(/^(\d)$/, '0')); if (format.indexOf("t") > -1) { if (hours > 11) { format = format.replace("t", "pm"); } else { format = format.replace("t", "am"); } } if (format.indexOf("HH") > -1) { format = format.replace("HH", hours.toString().replace(/^(\d)$/, '0')); } if (format.indexOf("hh") > -1) { if (hours > 12) { hours -= 12; } if (hours === 0) { hours = 12; } format = format.replace("hh", hours.toString().replace(/^(\d)$/, '0')); } if (format.indexOf("mm") > -1) { format = format.replace("mm", minutes.toString().replace(/^(\d)$/, '0')); } if (format.indexOf("ss") > -1) { format = format.replace("ss", seconds.toString().replace(/^(\d)$/, '0')); } return format; };
Comments