let obj = {value:'foo'};
给定对象obj
,我很好奇是否可以对其进行调整,以便console.log(obj)
输出"foo"
,而不是默认的定义/类型。
let obj = {
value: 'foo',
get() {
return this.value;
}
};
console.log( obj ); // want: "foo"; get: "[object Object]" (or the like)
console.log( obj.get() ); // "foo"

注意:我意识到答案很可能是"没有"由于很多原因(比如它是一个坏主意),但它肯定会使这一项任务变得更容易(将布尔值转换为对象)。
答案 0 :(得分:1)
基本上两个方法返回的值不是对象本身。
每个对象都有一个
toString()
方法,当要将对象表示为文本值或者以期望字符串的方式引用对象时,会自动调用该方法。默认情况下,toString()方法由来自Object
的每个对象继承。如果在自定义对象中没有覆盖此方法,`toString()将返回“[object type]”,其中 type 是对象类型。
JavaScript调用
valueOf
方法将对象转换为原始值。您很少需要自己调用valueOf
方法;当遇到期望原始值的对象时,JavaScript会自动调用它。默认情况下,来自
Object
的每个对象都会继承valueOf
方法。每个内置核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,valueOf
将返回对象本身。您可以在自己的代码中使用valueOf将内置对象转换为原始值。创建自定义对象时,您可以覆盖
Object.prototype.valueOf()
以调用自定义方法,而不是默认的Object
方法。
要解决您的问题,您可以将两种方法都实现为自定义函数。
当两种方法都实现并返回原始值时,首先调用valueOf
。如果valueOf
返回一个对象,则会调用toString
方法。
您可以查看这篇文章:Fake operator overloading in JavaScript
let obj = {
value: 'foo',
get() { return this.value; },
toString: _ => 'fourty',
valueOf: _ => 40
};
console.log(obj + 2);
console.log(obj + 'two');
console.log(obj.toString() + 'two');
console.log(obj);
console.log(obj.get() ); // "foo"
.as-console-wrapper { max-height: 100% !important; top: 0; }