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

为何访问函数的__proto__得到函数,Object.keys却无法检测到该属性?

问题解答

为什么Object.keys(objectFunction)返回空但能访问__proto__?

Object.keys()仅返回对象自身拥有、且可枚举的属性名数组。而__proto__是定义在Object.prototype上的访问器属性(getter/setter),它属于原型链继承来的属性——既不是objectFunction自身的属性,也不具备可枚举性,因此不会出现在Object.keys()的结果中。但根据JavaScript原型链的查找规则,当你访问objectFunction.__proto__时,会沿着原型链向上遍历,最终在Object.prototype上找到这个访问器,所以能正常访问到它。

关于__proto__和prototype的误解澄清

  • __proto__并非仅在实例上可用:**所有对象(包括函数,因为函数本质也是对象)**都能通过原型链访问到__proto__。函数的原型链路径是:函数实例 → Function.prototype → Object.prototype → null,而__proto__就挂载在Object.prototype上,所以函数也能访问它。你看到的objectFunction.__proto__返回的是Function.prototype(函数的原型对象),它本身是一个空函数,调用后自然返回undefined。
  • prototype是函数特有的属性:普通对象没有prototype属性,只有函数(箭头函数、生成器函数等特例除外)才具备这个属性,它的作用是作为该函数创建实例时的原型对象。比如用new objectFunction()创建的实例,其__proto__会直接指向objectFunction.prototype。

补充验证代码

你可以用以下代码验证上述结论:

// 检查__proto__是否是objectFunction自身的属性
console.log(objectFunction.hasOwnProperty('__proto__')); // false,说明是继承来的
// 检查__proto__是否可枚举
console.log(Object.prototype.propertyIsEnumerable('__proto__')); // false
// 验证objectFunction的原型确实是Function.prototype
console.log(objectFunction.__proto__ === Function.prototype); // true

内容的提问来源于stack exchange,提问作者Shekhar Dangi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:13