执行console.log(new X())时输出指定字符串的技术实现疑问
问题解答
这不是陷阱题,本质是考察你对JavaScript中new操作符工作机制的掌握。
为什么你的写法没用?
当用new调用构造函数时,存在返回值的判定规则:
- 如果构造函数返回的是对象类型(比如Object、Array、包装对象等),
new会直接返回这个对象; - 如果返回的是字符串、数字这类原始类型,
new会忽略这个返回值,转而返回它内部创建的构造函数实例。
你之前返回的是原始字符串"Hello",属于第二种情况,所以new X()最终返回的是X的实例,而非你写的字符串。
两种可行解法
解法1:返回对象类型的字符串
让构造函数返回String包装对象(属于对象类型),这样new会直接返回它,console.log输出时会显示目标字符串:
function X() { return new String("Hello"); }
解法2:重写实例的toString方法
console.log输出对象时,会自动调用对象的toString方法。我们可以给X的原型添加自定义的toString方法,让实例被输出时返回目标字符串:
function X() {} X.prototype.toString = function() { return "Hello"; };
如果用ES6类的写法会更简洁:
class X { toString() { return "Hello"; } }
内容的提问来源于stack exchange,提问作者Murtuza
相关产品推荐
相关产品推荐

