Answers:
您也可以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
属性的函数返回值,Object.prototype.toString.call(f)
并仍显示[object Object]
。
首先覆盖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为这些东西提供了更好的语法,但是您必须使用像Babel这样的编译器:
// 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}"
v0.10.*
或Chrome中无法解决Version 32.0.1700.102
。尽管直接调用(字符串)(字符串)或使用类型强制(字符串)的toString可以与此一起使用,但console [/ info | log /]用于旧的预修改toString。
如果对象是您自己定义的,则始终可以添加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);
添加“ Symbol.toStringTag”属性到自定义对象或类。
分配给它的字符串值将是其默认字符串描述,因为它是由内部访问的。 Object.prototype.toString()
方法在。
例如:
class Person {
constructor(name) {
this.name = name
}
get [Symbol.toStringTag]() {
return 'Person';
}
}
let p = new Person('Dan');
Object.prototype.toString.call(p); // [object Person]
一些Javascript类型(例如Maps和Promises)具有toStringTag
定义的内置符号
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(Promise.resolve()); // "[object Promise]"
因为Symbol.toStringTag
是众所周知的符号,所以我们可以引用它并验证上述类型是否具有Symbol.toStringTag属性-
new Map()[Symbol.toStringTag] // 'Map'
Promise.resolve()[Symbol.toStringTag] // 'Promise'
toString()
直接覆盖是唯一实现的方法function MyObj() {} Object.prototype.toString.call(new MyObj()) // "[object MyObj]"
吗?
Chrome控制台日志可让您检查对象。
console.log("this is my object:", obj)
。
-此操作需要花费大量时间才能完成,并且根据mozilla docs不建议使用此方法:https : //developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object/proto
-显然,现代的浏览器已弃用.prototype,而ECMA6则改为使用proper____proto__来指定。
因此,例如,如果要定义自己的对象地理区域,则应调用__proto__属性而不是.prototype:
var geoposition = {
lat: window.pos.lat,
lng: window.pos.lng
};
geoposition.__proto__.toString = function(){ return "lat: "+this.lat+", lng: "+this.lng }
console.log("Searching nearby donations to: "+geoposition.toString());
以下是如何对Map对象进行字符串化的示例:
Map.prototype.toString = function() {
let result = {};
this.forEach((key, value) => { result[key] = value;});
return JSON.stringify(result);
};
您可以给任何自定义对象自己的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()
如果您包括Prototype JavaScript Library,则可以覆盖,而不是重写,它可以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$1'));
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$1'));
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$1'));
}
if (format.indexOf("hh") > -1) {
if (hours > 12) {
hours -= 12;
}
if (hours === 0) {
hours = 12;
}
format = format.replace("hh", hours.toString().replace(/^(\d)$/, '0$1'));
}
if (format.indexOf("mm") > -1) {
format = format.replace("mm", minutes.toString().replace(/^(\d)$/, '0$1'));
}
if (format.indexOf("ss") > -1) {
format = format.replace("ss", seconds.toString().replace(/^(\d)$/, '0$1'));
}
return format;
};
typeof
)的最可靠方法。