是否可以让 JavaScript 对象评估为原始值

Is it possible to have JavaScript object evaluate to a primitive

我希望能够定义一个对象,该对象的计算结果为原始值,但也可能具有附加函数。实际上与 "String" class 的工作方式相同。有没有办法让我扩展 class 而无需 修改字符串原型。

我的一个用例是这样的:

class ID extends String{
   constructor(len){
      let value = 'Very unique id';
      this.len = len;
      this = value; //Or some other way of assigning the objects value
   }
   someRandomFunction(){
      console.log('I was called');
   }
}

const newId = new ID(10);
console.log(newId) // prints "Very unique id"
newId.someRandomFunction() // prints "I was called"
console.log(newId.len) // prints "10"

大多数与此相关的情况,您将隐式调用 newId[Symbol.toPrimitive]()。您可以在您的对象上定义此函数,这将导致能够精确定义您的对象在您尝试将其用作不同事物时的行为方式。

在你的例子中,它是一个围绕字符串值的包装对象,对吧?您可以简单地 return 所有对 toPrimitive 的调用的字符串,因此任何将您的对象用作对象以外的任何东西的尝试都会导致在支持字符串上执行操作。这是一个例子:

class ID {
   constructor(len){
      this.value = 'Very unique id';
      this.len = len;
   }

   [Symbol.toPrimitive](hint){
      return this.value;
   }

   someRandomFunction(){
      console.log('I was called');
   }
}

const newId = new ID(10);
console.log('' + newId) // prints "Very unique id"
newId.someRandomFunction() // prints "I was called"
console.log(newId.len) // prints "10"

请注意,console.log 是一个有点挑剔的函数:它检查参数的类型(您无法更改),如果它是一个对象,它不会将其强制转换为 运行 一些检查对象属性的代码。所以 console.log(newId) 你永远不会得到令人满意的自定义输出(除非你在 node.js)。它总是像一个对象一样打印。但是,任何将对象强制转换为基本类型的尝试,如 '' + newId 中所示,都会导致您想要的行为。