将方法挂到构造函数的 prototype 上可让所有实例共享,避免重复创建;需注意 constructor 属性不被覆盖、运行时修改立即生效,但不可在 prototype 上放置可变引用类型。

直接把函数赋值给构造函数的 prototype 属性,就能让所有实例共享这个方法。
把方法挂到 prototype 上是最基本的做法
构造函数本身有个 prototype 属性,它指向一个对象。只要把函数写在这个对象上,后续所有用 new 创建的实例,都能通过原型链访问到它:
- 不写在构造函数内部,避免每个实例都生成一份副本
- 写法统一:
Constructor.prototype.methodName = function() { ... }; - 调用时,实例自身没有该方法,就会自动向上查找到
Constructor.prototype
注意 constructor 属性别被覆盖
如果用 Object.assign 或直接赋值整个新对象给 prototype,原来的 constructor 会丢失:
- 错误写法:
Person.prototype = { sayHello() { ... } };→constructor指向Object - 正确做法:逐个添加,或补回
constructor:Person.prototype.constructor = Person; - 更稳妥的方式是用
Object.assign(Person.prototype, { sayHello() {}, walk() {} });
运行时修改原型,所有实例立刻生效
prototype 是普通对象,可随时增删改,这种改动对已存在和未来创建的实例都有效:
立即学习“Java免费学习笔记(深入)”;
- 比如重写
Person.prototype.sayHello,之前创建的p1、p2下次调用就用新逻辑 - 新增方法也一样:
Person.prototype.introduce = function() { ... };,所有实例马上能用 - 但要注意:不能用
=直接替换整个prototype,否则已存在的实例仍指向旧原型
别在 prototype 上放可变引用类型
像数组、对象这类引用类型,如果直接挂在 prototype 上,会被所有实例共享,容易互相干扰:
- 危险示例:
Person.prototype.hobbies = [];→p1.hobbies.push('读书')会让p2.hobbies也多出一项 - 正确方式:在构造函数里初始化,或用 getter 返回新数组:
get hobbies() { return []; } - 只把纯函数、常量字符串、数字等安全值放在 prototype 上


















