javascript原型支持运行时动态扩展:向构造函数prototype添加属性或方法,所有新旧实例立即生效;删除原型属性会触发回退查找,而实例自有属性不受影响。

可以在运行时直接向构造函数的 prototype 对象添加新属性或方法,所有已存在和未来创建的实例会立即获得这些扩展能力——这是 JavaScript 原型最核心的动态特性。
直接往 prototype 上挂载新方法或属性
只要获取到目标构造函数(比如 Person、Array 或自定义类),就能随时往它的 prototype 写入内容:
-
Person.prototype.greet = function() { return `Hello, ${this.name}` };→ 所有new Person()实例立刻可调用.greet() -
Array.prototype.first = function() { return this[0]; };→ 后续任意数组如[1,2,3].first()都能用 - 也可以添加数据属性:
String.prototype.isLong = function() { return this.length > 10; };
修改后对已有实例立即生效
原型是“活”的,不是快照。扩展行为不依赖对象是否已创建:
- 先创建
const p = new Person('Alice');,再执行Person.prototype.sayHi = () => 'Hi!'; - 此时
p.sayHi()就能正常调用,无需重建实例 - 同理,给
Array.prototype加方法后,所有现存数组也能立刻使用
删除或覆盖原型上的成员
用 delete 操作符可移除原型上的属性或方法,影响所有未自行定义该属性的实例:
-
delete Person.prototype.sayHello;→ 此后所有未覆盖sayHello的实例调用会返回undefined - 若某实例已设置
p.sayHello = function(){...},则delete Person.prototype.sayHello不会影响p.sayHello - 重新赋值同名方法即覆盖:
Person.prototype.sayHello = function(){ ... };会替换原有实现
注意内置原型扩展的风险与防护
对 Array、Object、String 等内置构造函数的 prototype 扩展需格外谨慎:
- 避免命名冲突:加前缀如
myMapAsync,或先检查是否存在:if (!('myFilter' in Array.prototype)) { ... } - 生产环境建议优先扩展自定义类,而非全局原型
- 如需控制枚举性或可写性,用
Object.defineProperty替代简单赋值,例如设为enumerable: false可防止被for...in遍历到
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











