prototype是函数对象独有的属性,指向其原型对象,实例通过__proto__访问它实现方法共享;普通对象无prototype;重写原型需手动修复constructor;原型链终点为object.prototype。

JavaScript 中的 prototype 是函数对象独有的属性,而 构造函数.prototype 就是这个属性的具体体现——它指向该构造函数的原型对象,是实例共享方法和属性的“公共仓库”。
prototype 是函数才有的属性
只有函数(且非箭头函数)才有 prototype 属性。这个属性默认是一个普通对象,自带一个 constructor 属性,指向该函数本身。
- 普通对象(如
{}、new Date())没有prototype属性,访问会得undefined - 函数一旦定义,JS 引擎就自动为其创建
prototype,无需手动声明 -
Function、Array、Object等内置构造函数也遵循同一规则,它们的prototype上预置了push、toString等方法
构造函数.prototype 是实例的“原型源头”
当你用 new Fn() 创建实例时,该实例内部的 __proto__ 会被自动设为 Fn.prototype。这意味着:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 所有通过同一构造函数创建的实例,其
__proto__都指向同一个Fn.prototype对象 - 向
Fn.prototype添加方法(如Fn.prototype.say = function(){}),所有已有和后续实例都能立即使用 - 实例自身不存储这些方法,而是沿
__proto__向上委托查找——这就是原型链的起点
constructor 属性需要小心维护
Fn.prototype.constructor 默认指向 Fn,但若你直接赋值替换整个原型(如 Fn.prototype = { say(){} }),这个 constructor 就会丢失,变成 Object 的构造器。
- 修复方式:在重写原型后手动补上
constructor: Fn - 例如:
Fn.prototype = { constructor: Fn, say(){} } - 否则
new Fn().__proto__.constructor === Object,而非Fn,可能影响类型判断或序列化逻辑
原型链最终归于 Object.prototype
Fn.prototype 本身也是一个对象,所以它也有自己的 __proto__,其值为 Object.prototype;而 Object.prototype.__proto__ 是 null,标志着原型链终点。
- 因此所有构造函数的实例,都间接继承自
Object.prototype上的方法(如hasOwnProperty、isPrototypeOf) - 可通过
obj.__proto__.__proto__ === Object.prototype验证这一层级 - 这种逐级向上查找的机制,就是 JavaScript 实现继承与方法共享的核心
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










