prototype是函数对象用于定义共享方法和属性的属性,实现继承与复用;实例通过__proto__访问它,构成原型链查找机制;class语法糖本质即操作prototype,需避免在prototype上定义可变引用类型。

JavaScript中prototype属性用于为构造函数定义所有实例共享的方法和属性,是实现继承和复用的核心机制。
prototype只对函数有效
只有函数对象才有prototype属性(箭头函数除外),它默认是一个空对象,且自带constructor指向该函数本身。普通对象、基本类型或类(本质仍是函数)的prototype行为一致。
- 创建构造函数后,直接在其
prototype上添加方法,所有实例都能访问 - 不要重写整个
prototype对象,否则会丢失constructor,如需重写应手动恢复:MyClass.prototype.constructor = MyClass
实例通过__proto__访问prototype
每个实例对象内部都有一个__proto__(非标准但广泛支持),它指向其构造函数的prototype。这是原型链查找的依据:访问属性时,先查实例自身,再沿__proto__向上找,直到null。
-
obj.__proto__ === Constructor.prototype通常成立(严格模式下obj.constructor.prototype更稳妥) - 不建议直接操作
__proto__,推荐用Object.getPrototypeOf(obj)和Object.setPrototypeOf(obj, proto)
与class语法的关系
ES6 class只是语法糖,class A { method(){} }等价于在A.prototype上定义method。静态方法则挂载在类本身,不进prototype。
立即学习“Java免费学习笔记(深入)”;
- 类中的方法自动添加到
prototype,不可枚举 - 类字段(如
name = 'x')属于实例自身,不在prototype上
常见误用和注意点
把引用类型(如数组、对象)定义在prototype上会导致所有实例共享同一份数据,引发意外修改。
- 错误写法:
Person.prototype.hobbies = []→ 所有人共用一个数组 - 正确做法:在构造函数内初始化,或用
get访问器返回新副本 - 避免在
prototype上放可变数据,适合放纯函数或常量


















