You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS扩展String实例自定义greetable方法输出[object String]问题求解

问题修复方案

问题原因

  • 自定义的greetablePrototype默认原型指向Object.prototype,当你把String实例的原型替换为greetablePrototype后,丢失了对String.prototype的继承,导致调用this.valueOf()时实际执行的是Object.prototype.valueOf(),返回的是String对象本身,拼接成字符串后就变成了[object String]。同时这种写法也会导致实例无法调用原生String的所有方法,不符合需求。
  • 冗余写法:createGreetable本身是工厂函数,内部已经完成了String实例的创建,调用时不需要加new关键字。

修复代码

// 先将自定义原型的原型指向String.prototype,保留所有原生字符串方法
const greetablePrototype = Object.create(String.prototype);
greetablePrototype.greetable = function(greeting) {
  this.greet = `${greeting}, ${ this.valueOf() }!`
}

function createGreetable(str) {
  const result = new String(str);
  Object.setPrototypeOf(result, greetablePrototype)
  return result;
}

// 调用时去掉new
const t = createGreetable("world");
t.greetable("hello");
console.log(t.greet);
console.log(t.length);
// 也可正常调用所有原生字符串方法,比如t.toUpperCase()

运行结果

hello, world!
5

完全符合预期要求。

内容的提问来源于stack exchange,提问作者Finch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:45:04