直接向构造函数prototype赋值函数是添加共享方法的标准方式,所有实例即时共享;应避免覆盖整个prototype,推荐用点号、方括号或Object.assign批量添加;原型可动态修改,但引用类型属性须在构造函数中初始化。

直接往构造函数的 prototype 上赋值函数,是最简单、最标准的动态添加共享方法的方式。所有通过该构造函数创建的实例,都能立即访问这个方法,且共用同一份函数体。
用点号或方括号语法添加单个方法
这是最常用也最直观的做法。只要确保在实例创建前或后操作 prototype,方法就会被所有实例共享(包括已存在的):
-
推荐写法:用点号添加
Person.prototype.sayHi = function() { console.log('Hi, ' + this.name); }; -
也可用方括号(适合动态键名)
Person.prototype['getInfo'] = function() { return `${this.name} is ${this.age} years old.`; };
批量添加多个方法,避免覆盖整个 prototype
不要直接赋值 Person.prototype = { ... },否则会切断已有实例的原型链,导致它们无法访问新方法。应逐个添加,或用 Object.assign 安全合并:
-
安全批量添加(推荐)
Object.assign(Person.prototype, {<br> walk: function() { console.log(this.name + ' is walking'); },<br> run: function() { console.log(this.name + ' is running'); }<br>}); -
错误做法(会断开已有实例连接)
Person.prototype = { walk() {}, run() {} }; // ❌ 已有实例将丢失原型方法
运行时修改已存在方法,所有实例即时响应
原型对象是活的普通对象,随时可改。修改后,无论实例是之前创建的还是之后创建的,调用时都会执行新逻辑:
- 比如重写
sayHi:Person.prototype.sayHi = function() { console.log('Hey there, ' + this.name.toUpperCase()); }; - 此时
a.sayHi()和b.sayHi()都会输出大写名字,无需重新实例化。
注意引用类型属性不要放在 prototype 上
方法可以放心挂 prototype,但像数组、对象这类引用类型属性不能直接放——否则所有实例共享同一份数据,容易互相干扰:
-
危险示例:
Person.prototype.tags = [];→p1.tags.push('admin')会让p2.tags也变。 - 正确做法:这类数据应在构造函数内初始化为实例自有属性。











