修改原型对象是否影响已有实例取决于操作方式:直接增删改属性会影响已有实例,因实例__proto__仍指向原原型;而用字面量重写prototype则不影响已有实例,因其__proto__仍指向旧原型。

修改原型对象是否影响已有实例,取决于“怎么改”。不是所有修改都会波及已创建的实例,关键看操作是否改变了实例当前所指向的那个原型对象。
直接在原型上增删改属性(安全,会影响已有实例)
只要不替换整个 prototype 对象,而是在它上面添加、删除或重写方法/属性,所有已存在的实例都能立即访问到新内容——因为它们的 __proto__ 仍指向同一个原型对象。
-
新增方法:如
Person.prototype.sayHi = function() {...},new Person()创建的所有实例立刻能调用sayHi -
覆盖方法:如把原来的
sayName改成新实现,所有实例调用时都执行新版 -
修改引用类型属性:若
Person.prototype.tags = [],某实例执行person1.tags.push('admin'),其他实例读取tags也会看到这个新增项(共用同一数组)
用字面量完全重写 prototype(危险,不影响已有实例)
如果执行 Person.prototype = { ... },相当于丢弃旧原型、新建一个对象。此时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 已创建的实例,其
__proto__仍指向**原来的原型对象**,不受新赋值影响 - 后续
new Person()创建的实例,__proto__才会指向这个新原型 - 结果是:新旧实例“不再共享同一套原型”,行为可能不一致,容易引发隐蔽 bug
修改 constructor 指向(易被忽略,影响类型识别)
重写 prototype 后常忘记恢复 constructor:
立即学习“Java免费学习笔记(深入)”;
- 若写
Person.prototype = { sayHi() {} },新原型上没有constructor属性,实例通过原型链查到的是Object.prototype.constructor(即Object) - 导致
person.constructor === Person为false,instanceof虽仍正确,但new person.constructor()会生成Object实例而非Person - 调试、序列化、框架反射等依赖构造器的场景容易出错
对内置对象原型动手(高风险,全局污染)
如 Array.prototype.last = ...:
- 所有数组(包括第三方库创建的、
JSON.parse返回的)都会获得该方法 - 可能与未来标准冲突,或干扰其他模块的逻辑(尤其当方法名重复、行为不一致时)
- 推荐替代方案:工具函数(
last(arr))、自定义子类(class MyArray extends Array)、Symbol 隔离

















