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

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会按照函数自身的原型链去查找:

  1. 先看func这个函数对象自己有没有m属性?显然没有,你没给它加过。
  2. 然后去它的原型Function.prototype里找?也没有m。
  3. 再往上到Object.prototype?还是没有。
  4. 最后到null,找不到就返回undefined。

而func.prototype.m是直接访问func的prototype属性上的m,当然能拿到9,这是直接访问对象属性,不是原型委托哦。

一句话总结

func.prototype是给实例用的原型容器,不是给函数自己用的。函数自己的原型链和它的prototype属性完全是两条线~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:16