如何在使用new创建类实例时直接返回字符串而非实例对象?
回答
这个需求是完全可行的,根据实际使用场景可以选择不同的实现方案:
场景1:需要实例在所有字符串上下文表现和原始字符串一致(推荐方案)
这种方案遵循JS语法规范,适配所有日常使用场景,代码如下:
class ExampleClass { constructor(str) { this.str = str; } // 处理隐式类型转换 [Symbol.toPrimitive](hint) { return hint === 'number' ? this.str.length : this.str; } // 处理显式转字符串 toString() { return this.str; } // 处理原始值转换 valueOf() { return this.str; } } const str = new ExampleClass('example'); console.log(str.toString()) // 'example' console.log(str == 'example') // true console.log(`${str}`) // 'example' console.log(str + ' suffix') // 'example suffix'
如果需要console.log(str)直接输出'example'而非实例对象结构,可以继承String原生类,同时适配Node.js的打印规则:
class ExampleClass extends String { constructor(str) { super(str); // 适配Node.js环境console.log输出 this[Symbol.for('nodejs.util.inspect.custom')] = () => `'${this.toString()}'`; } } const str = new ExampleClass('example'); console.log(str); // 'example' console.log(str.slice(0,3)); // 'exa' 所有原生字符串方法都可以直接调用
场景2:需要得到完全的原始字符串类型
按照ECMAScript规范,new操作符的设计逻辑是必须返回对象类型,构造函数如果返回原始值会被自动忽略,Proxy的construct陷阱返回原始值也会抛出类型错误,因此无法直接通过new得到原始字符串。如果有强需求只能通过特殊hack实现,不推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者BERTOLDO
相关产品推荐
相关产品推荐

