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
相关产品推荐
相关产品推荐

