繁体   English   中英

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

[英]Is it possible to have JavaScript object evaluate to a primitive

我希望能够定义一个对象,该对象将评估为原始但也可能具有附加功能。 实际上与“String”类的工作方式相同。 有没有办法让我在修改 String 原型的情况下扩展类。

我的一个用例是这样的:

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]() 你可以在你的对象上定义这个函数,这样当你尝试将它用作不同的东西时,这将导致能够精确地定义你的对象的行为方式。

在您的情况下,它是一个围绕字符串值的包装对象,对吗? 您可以简单地为对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都将导致您想要的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM