为何访问函数的__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
相关产品推荐
相关产品推荐

