JavaScript函数原型委托疑问:为何func.m返回undefined?
搞懂JavaScript原型:为什么
func.m是undefined? 嘿,我来帮你把这个原型的困惑彻底捋明白~咱们先从你贴的代码说起,再拆解核心概念:
var func = function (){}; func.prototype = {m:9}; func.prototype.m; // 输出9 func.m; // 输出undefined
核心误区:别把「函数的prototype属性」和「函数自身的原型链」搞混
这里的关键是要区分两个完全不同的东西:
func.prototype:这是一个专门给「func作为构造函数创建出来的实例」准备的原型对象。当你用new func()生成实例时,这个实例的内部原型([[Prototype]])会指向func.prototype,所以实例能访问到上面的m属性。比如:var instance = new func(); console.log(instance.m); // 这里会输出9,这才是原型委托生效的场景- 函数
func自身的原型链:func本身也是一个对象(JavaScript里函数都是对象),它自己的原型链是指向Function.prototype的,而不是它自己的func.prototype属性!
为什么func.m会返回undefined?
当你访问func.m时,JavaScript会按照函数自身的原型链去查找:
- 先看
func这个函数对象自己有没有m属性?显然没有,你没给它加过。 - 然后去它的原型
Function.prototype里找?也没有m。 - 再往上到
Object.prototype?还是没有。 - 最后到
null,找不到就返回undefined。
而func.prototype.m是直接访问func的prototype属性上的m,当然能拿到9,这是直接访问对象属性,不是原型委托哦。
一句话总结
func.prototype是给实例用的原型容器,不是给函数自己用的。函数自己的原型链和它的prototype属性完全是两条线~
内容的提问来源于stack exchange,提问作者Rachit Gupta
相关产品推荐
相关产品推荐

