javascript扩展底层对象应优先修改构造函数的prototype,使所有实例共享新属性或方法;可新增方法(如introduce)、数据属性(如isalive),但需警惕原生对象扩展风险;动态切换原型用object.setprototypeof,轻量继承用object.create。

JavaScript 中通过原型链扩展底层对象,本质是往构造函数的 prototype 对象上添加属性或方法,让所有实例(包括已创建和后续新建的)自动获得新能力。这不是修改实例本身,而是改变它们共同的“模板”。
向构造函数 prototype 添加功能
这是最直接、最常用的扩展方式。只要把新属性或方法挂到构造函数的 prototype 上,所有该类型的实例立刻可用。
-
新增方法:比如给
Person构造函数添加通用行为:Person.prototype.introduce = function() { return `I'm ${this.name}` };
之后每个new Person()实例都能调用.introduce()。 -
新增数据属性:如设置默认值:
Person.prototype.isAlive = true;
所有实例初始都继承这个值,且不占用各自内存空间。 -
注意原生对象扩展风险:向
Array.prototype或String.prototype添加方法(如Array.prototype.last = function() { return this[this.length-1] })虽可行,但需避免命名冲突,尤其在团队协作或使用第三方库时。
利用 Object.setPrototypeOf 动态切换原型
如果已有对象,又想让它临时具备某类原型上的能力,可以用 Object.setPrototypeOf(obj, newPrototype) 直接重设其 [[Prototype]]。
- 适用于运行时行为增强,比如让一个普通对象“借用”数组的方法:
const obj = { 0: 'a', 1: 'b', length: 2 };<br>Object.setPrototypeOf(obj, Array.prototype);<br>obj.push('c'); // 现在能用了 - 该操作会改变对象的整个查找链,需谨慎使用,频繁调用可能影响性能,也不推荐用于生产环境中的常规扩展。
用 Object.create 构建带指定原型的新对象
当你不需要构造函数,只想要一个干净的对象并明确指定它的原型来源,Object.create 是更轻量、更语义化的方式。
- 例如复用已有对象作为原型:
const animal = { eats: true };<br>const rabbit = Object.create(animal);<br>console.log(rabbit.eats); // true - 它生成的对象,其
__proto__直接指向传入的对象,跳过构造函数环节,适合组合式对象建模或配置对象继承。
避免污染实例,优先扩展原型
扩展底层对象的关键原则是:**别往实例上加,往 prototype 上加**。否则就变成单个对象的私有属性,失去共享意义。
- 错误做法:
const p = new Person(); p.sayHi = function() {...}→ 只有p有,其他实例没有。 - 正确做法:
Person.prototype.sayHi = function() {...}→ 所有Person实例立即拥有,且内存只存一份。 - 可通过
hasOwnProperty检查属性是否来自实例自身,辅助验证扩展是否生效在原型层。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











