为何在repl.it与SO代码片段中,JS原型方法输出结果存在差异?
为什么不同环境下控制台输出有差异?
这个问题的核心在于不同JavaScript环境的控制台对对象的显示规则不一样,咱们一步步拆解清楚:
1. 关于grizzly和bBear的显示差异
你定义的growl方法是挂在Bear.prototype上的,属于原型链层面的属性,并不是对象自身的直接属性:
Bear.prototype.growl = function(){ console.log('grrr') }
- Stack Overflow的代码片段用的是浏览器控制台(或模拟了浏览器控制台的逻辑),它会把对象原型链上的属性也整合到输出里(或者默认展开显示完整结构),所以你能看到包含
growl的对象内容。 - repl.it的控制台则走了简洁路线:只输出对象自身的直接属性(也就是你通过
this.type = type定义的type),原型链上的内容不会直接显示在顶层输出中。但你要是在repl.it里直接敲grizzly.growl(),一样能正常执行——它只是没在默认输出里展示而已。
2. 关于Bear.growl的输出差异
你说repl.it里没看到undefined,这其实是repl.it的控制台优化:当连续打印多个值时,它可能会省略掉undefined这类“无意义”的输出,或者合并了输出内容。但实际上Bear.growl确实是undefined,因为growl是挂在Bear.prototype上,而不是Bear构造函数自身的属性。你可以在repl.it里单独执行console.log(Bear.growl),就能看到预期的undefined了。
快速验证原型链的小技巧
不管在哪个环境,你都可以用下面的代码确认原型关系:
console.log(grizzly.hasOwnProperty('type')); // true,是对象自身属性 console.log(grizzly.hasOwnProperty('growl')); // false,来自原型链 console.log(Bear.prototype.isPrototypeOf(grizzly)); // true,确认原型继承关系
内容的提问来源于stack exchange,提问作者mechaniac
相关产品推荐
相关产品推荐

