创建x = new Date()
对象时,如果将其放入console.log(x)
,则会输出一个字符串。
有没有办法让自定义对象返回一个不是对象本身的不同值
答案 0 :(得分:2)
有一个函数toString,但是如果你只做console.log(new Test)
它仍会输出对象。但是,如果您强行打印字符串,它将起作用:console.log('%s', new Test)
:
function Test() {
}
Test.prototype.toString =
function () {
return "Something else";
}
console.log("%s", new Test);
> Something else
或者如果你将它与另一个字符串连接起来:
var a = new Test;
console.log('Result: ' + a);
> Result: Something else
我在代码中经常使用它来显示带有数据的对象内容的摘要。
还有valueOf:
Test.prototype.valueOf =
function () {
return 42;
}
console.log("%d", new Test);
> 3
答案 1 :(得分:0)
您可以将大多数对象转换为字符串,如下所示
as! String
像
String(object)
同样
x = String(new Date()); // now x is a string
答案 2 :(得分:0)
覆盖对象的toString:
我上面的评论也提到了 toString 。您可以使用JSON.stringify在对象的toString方法中即时打印对象的所有属性:
function MyObject() {
this.a = 'a';
this.b = 'b';
this.c = 'c';
}
MyObject.prototype.toString = function () {
return JSON.stringify(this);
};
console.log((new MyObject()).toString()); // {"a":"a","b":"b","c":"c"}
// or
console.log('new MyObject(): ' + new MyObject()); // new MyObject(): {"a":"a","b":"b","c":"c"}
覆盖console.log:
另一种尝试可能是覆盖console.log以打印始终字符串(仅在FF中测试!):
// initialize this only once so that console.log prints out correctly
(function () {
var oldConsole = console.log;
console.log = function (obj) {
oldConsole(JSON.stringify(obj));
};
}) ();
// now console.log prints strings
console.log({
a: 'a'
}); // String: {"a":"a"}
console.log(new Date()); // String: "2017-01-19T19:09:49.673Z"
console.log(document); // String: {"location":{"href":"http://stackoverflow.com/questions/41748793/javascript-how-to-get-an-object-to-return-a-value-that-is-not-the-object-itsel/41749121#41749121","origin":"http://stackoverflow.com","protocol":"http:","host":"stackoverflow.com","hostname":"stackoverflow.com","port":"","pathname":"/questions/41748793/javascript-how-to-get-an-object-to-return-a-value-that-is-not-the-object-itsel/41749121","search":"","hash":"#41749121"},"jQuery112409140067213472354":3}
答案 3 :(得分:0)
基本上两个方法返回的值不是对象本身。
每个对象都有一个
toString()
方法,当要将对象表示为文本值或者以期望字符串的方式引用对象时,会自动调用该方法。默认情况下,toString()方法由来自Object
的每个对象继承。如果在自定义对象中未覆盖此方法,则`toString()将返回" [对象类型]",其中 type 是对象类型。
JavaScript调用
valueOf
方法将对象转换为原始值。您很少需要自己调用valueOf
方法;当遇到期望原始值的对象时,JavaScript会自动调用它。默认情况下,来自
Object
的每个对象都会继承valueOf
方法。每个内置核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,valueOf
将返回对象本身。您可以在自己的代码中使用valueOf将内置对象转换为原始值。创建自定义对象时,您可以覆盖
Object.prototype.valueOf()
以调用自定义方法,而不是默认的Object
方法。
要解决您的问题,您可以将两种方法都实现为自定义函数。
当两种方法都实现并返回原始值时,首先调用valueOf
。如果valueOf
返回一个对象,则会调用toString
方法。
您可以查看这篇文章:Fake operator overloading in JavaScript
function Custom(value) {
this.value = value;
}
Custom.prototype.valueOf = function () {
console.log('valueOf');
return this.value * 5;
};
var custom = new Custom(7);
console.log('' + custom); // no toString
Custom.prototype.toString = function () {
console.log('toString');
return this.value * 3;
};
Custom.prototype.valueOf = function () {
console.log('valueOf');
return {};
};
console.log('' + custom);