JavaScript中通过prototype扩展原型对象,本质是向构造函数的prototype添加属性或方法,使所有实例共享;可批量添加但需修复constructor,扩展内置对象需谨慎,且新增方法对已有实例立即生效。

在 JavaScript 中,通过 prototype 属性扩展原型对象,本质是向构造函数的 prototype 对象上添加属性或方法,让所有该构造函数创建的实例共享这些新增能力。
给构造函数的 prototype 添加方法
这是最常见的方式。每个函数都有一个 prototype 属性,它默认是一个普通对象,会被赋值给用 new 创建的实例的内部 [[Prototype]](即 __proto__)。
例如,为自定义构造函数 Person 添加一个通用方法:
function Person(name) {
this.name = name;
}
<p>// 扩展原型:所有 Person 实例都能调用 sayHello
Person.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
};</p><p>const p1 = new Person('Alice');
const p2 = new Person('Bob');</p><p>p1.sayHello(); // Hello, I am Alice
p2.sayHello(); // Hello, I am Bob
批量添加多个原型成员
直接赋值一个新对象给 prototype 可以一次性添加多个方法,但要注意重置 constructor 指针,否则实例的 constructor 会指向 Object 而非原构造函数。
立即学习“Java免费学习笔记(深入)”;
- 使用对象字面量替换
prototype - 手动恢复
constructor属性
function Animal(name) {
this.name = name;
}
<p>Animal.prototype = {
constructor: Animal, // 关键:修复 constructor
eat() { console.log(this.name + ' is eating'); },
sleep() { console.log(this.name + ' is sleeping'); }
};</p><p>const dog = new Animal('Dog');
console.log(dog.constructor === Animal); // true
扩展内置对象的 prototype(谨慎使用)
JavaScript 内置构造函数(如 Array、String)也有 prototype,可以添加方法,但需注意兼容性和全局影响。
- 仅在必要时扩展,避免与未来标准或第三方库冲突
- 优先使用工具函数或类封装,而非污染原生原型
// 示例:为数组添加一个安全的 last 方法(不推荐生产环境滥用)
if (!Array.prototype.last) {
Array.prototype.last = function() {
return this[this.length - 1];
};
}
[1, 2, 3].last(); // 3
注意原型链与属性查找机制
实例访问属性或方法时,会先查自身,再沿 [[Prototype]] 链向上查找。因此通过 prototype 添加的内容对已有实例也立即生效。
例如:
function Cat(name) { this.name = name; }
const c = new Cat('Whiskers');
<p>// 在实例创建后扩展 prototype,c 仍可访问新方法
Cat.prototype.meow = function() { console.log('Meow!'); };
c.meow(); // Meow!
不复杂但容易忽略。


















