函数原型与Object.__proto__疑问:a.prototype为何不等于Function或Object?
关于函数原型的疑问解答
先明确两个容易混淆的核心概念:
__proto__:所有对象(包括函数)的内部原型指针,指向自身构造函数的prototype属性。prototype:只有函数对象拥有这个属性,是用来给它的实例做原型的——当你用new调用函数时,生成的实例的__proto__会直接指向该函数的prototype。
为什么a.__proto__ === Object.__proto__返回true?
你定义的function a(){}是一个函数对象,所有函数都是Function构造函数的实例,所以a.__proto__指向Function.prototype。
而Object本身也是一个构造函数(属于函数对象),它的构造函数同样是Function,所以Object.__proto__也指向Function.prototype。这就是两者相等的原因。
为什么a.prototype不等于Function或Object?
a.prototype是一个普通对象(默认情况下,除了Function.prototype本身是函数,其他函数的prototype都是普通对象),它的作用是给a的实例提供专属的原型属性。比如你给a.prototype.add = function(){}, 用new a()创建的实例就能直接调用.add()方法。
如果a.prototype等于Object,那所有a的实例的__proto__就直接指向Object了——这会抹杀掉a作为独立构造函数的原型层级,你没法给a的实例添加独有的原型方法,完全复用Object的原型逻辑,反而违背了原型链设计的灵活性。
另外补充:a.prototype.__proto__才等于Object.prototype,这保证了a的实例既能继承a.prototype的属性,也能通过原型链继承Object.prototype的通用属性(比如.toString())。
内容的提问来源于stack exchange,提问作者Lynera pintcho
相关产品推荐
相关产品推荐

