JavaScript中普通函数创建时自动拥有prototype属性,指向含constructor(指向自身)和__proto__(指向Object.prototype)的原型对象;箭头函数和bind返回函数无prototype。

JavaScript 中,每个函数在创建时都会自动拥有一个 prototype 属性,这个属性指向一个默认生成的对象——即“原型对象”。这不是手动赋值的结果,而是引擎在函数声明或表达式求值阶段就完成的内置行为。
函数一诞生,prototype 就存在
无论你用函数声明、函数表达式,还是箭头函数(注意:箭头函数没有 prototype),只要是一个“普通函数”,JS 引擎就会在它被创建的那一刻,为其挂载一个非空的 prototype 对象。
- 这个
prototype是一个普通对象,不是函数本身,也不是空对象{},而是带有一个constructor属性的对象,该属性指向函数自身; - 例如:
function Foo() {}创建后,Foo.prototype已存在,且Foo.prototype.constructor === Foo为 true; - 即使函数体为空、从未被调用,
prototype也早已就位。
prototype 的结构是标准化的
引擎为函数初始化 prototype 时,会按规范设置两个关键部分:
- constructor 属性:指向该函数本身,用于标识“谁造出了这个原型”;
-
[[Prototype]] 内部链接:
Foo.prototype.__proto__指向Object.prototype,保证它能继承toString、hasOwnProperty等基础方法。
也就是说,Foo.prototype 本质上是一个普通对象,只是被“指定”为将来所有 new Foo() 实例的共享原型。
不是所有函数都有 prototype
有两类函数例外,它们的 prototype 属性不存在或为 undefined:
-
箭头函数:没有自己的
this,也没有prototype,不能用作构造函数; -
bind 返回的函数:通过
fn.bind()生成的函数,其prototype为undefined,同样不可new。
只有具有“构造能力”的函数(即 [[Construct]] 内部方法存在的函数)才被赋予 prototype。
这个机制不依赖 new,也不依赖运行时
prototype 的挂载发生在函数对象创建时,和后续是否调用、是否用 new、是否添加方法都无关。你可以立即访问它:
console.log(typeof (function(){}).prototype); // "object"
console.log((() => {}).prototype); // undefined
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











