直接往构造函数的prototype上添加方法或属性是最标准的动态扩展方式,所有新旧实例立即共享;可用点号、方括号或object.assign批量添加,但不可替换整个prototype,引用类型属性需谨慎避免共享副作用。

直接往构造函数的 prototype 上添加方法或属性,就是最标准、最常用的动态扩展方式。它让所有已有和后续创建的实例立即共享这些新能力,无需修改单个对象,也不依赖非标准的 __proto__。
用点号或方括号直接赋值
这是最简洁的做法。只要没冻结原型(Object.freeze(Constructor.prototype)),就能随时添加:
-
添加方法:
Person.prototype.getName = function() { return this.name; }; -
添加属性(适合常量或默认配置):
Person.prototype.API_BASE = 'https://api.example.com'; -
用方括号支持动态键名:
const key = 'isValid'; Person.prototype[key] = function() { return this.age > 0; };
批量添加:用 Object.assign
一次注入多个方法或属性,代码更紧凑,也便于组织逻辑:
Object.assign(Person.prototype, {getName() { return this.name; },setAge(age) { this.age = age; },version: '2.1'});
注意:不要用 Person.prototype = { ... } 替换整个 prototype,否则已存在的实例将无法访问新方法,且会丢失 constructor 指向。
添加后,所有实例立刻可用
无论是添加前就创建的实例,还是之后用 new Person() 创建的,都能立即使用新方法:
const p1 = new Person('Tom', 25);const p2 = new Person('Lily', 28);console.log(p1.getName()); // "Tom"console.log(p2.getName()); // "Lily"console.log(p1.version === p2.version); // true,共享同一份值
引用类型属性要小心共享副作用
如果添加的是数组或对象这类引用类型,默认是所有实例共用同一份内存:
Person.prototype.tags = [];p1.tags.push('admin');console.log(p2.tags); // ['admin'] —— p2 也变了
想避免这种影响,要么在构造函数里初始化(this.tags = []),要么只把不可变数据(如配置对象)加到 prototype,并用 Object.freeze 锁定:Object.freeze(Person.prototype.defaultConfig);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











