当没有指定键时,是否可以在对象上设置默认的getter?

时间:2017-07-28 19:43:03

标签: javascript

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"




注意:我意识到答案很可能是"没有"由于很多原因(比如它是一个坏主意),但它肯定会使这一项任务变得更容易(将布尔值转换为对象)。

1 个答案:

答案 0 :(得分:1)

基本上两个方法返回的值不是对象本身。

Object#toString

  

每个对象都有一个toString()方法,当要将对象表示为文本值或者以期望字符串的方式引用对象时,会自动调用该方法。默认情况下,toString()方法由来自Object的每个对象继承。如果在自定义对象中没有覆盖此方法,`toString()将返回“[object type]”,其中 type 是对象类型。

Object#valueOf

  

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; }