可通过object.setprototypeof()动态修改已有对象原型,或用object.create()在创建时指定原型;不推荐使用已弃用的__proto__属性。

可以通过 Object.setPrototypeOf() 方法或在创建对象时用 Object.create() 指定原型,来修改对象的原型链指向另一个对象。
使用 Object.setPrototypeOf() 动态修改原型
这是最直接的方式,适用于已存在的对象。它会把目标对象的 [[Prototype]] 内部属性设置为指定的对象。
- 语法:
Object.setPrototypeOf(obj, prototype) - 第一个参数是待修改的对象,第二个参数是要指向的新原型对象(可以是 null)
- 成功返回修改后的对象;若第一个参数不是对象,会抛出 TypeError
- 注意:频繁调用会影响性能,且部分 JavaScript 引擎可能无法优化这类操作
示例:
const parent = { sayHello() { return 'Hello'; } };const child = { name: 'Alice' };
Object.setPrototypeOf(child, parent);
console.log(child.sayHello()); // 'Hello'
创建时指定原型:Object.create()
如果还没创建对象,推荐用 Object.create(),它在初始化阶段就设定好原型,更清晰、更高效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 语法:
Object.create(prototype, [propertiesObject]) - 第一个参数是新对象将要继承的原型对象(可为 null)
- 第二个参数是可选的属性描述符对象,用于定义自有属性
示例:
const animal = { speak() { return this.name + ' makes a sound'; } };const dog = Object.create(animal, {
name: { value: 'Buddy', writable: true }
});
console.log(dog.speak()); // 'Buddy makes a sound'
不推荐的方式:__proto__ 属性
__proto__ 是非标准但被广泛支持的访问器属性,可用于读写原型。但它已被 ES6 标准标记为“deprecated”,不建议在生产代码中使用。
- 可读可写,例如:
obj.__proto__ = newProto - 行为不一致:在某些环境(如严格模式下某些旧引擎)可能静默失败
- 可读性差,且容易与
prototype(构造函数上的属性)混淆
注意事项和常见误区
修改原型链不会影响已有属性的查找结果,但会影响后续对继承方法/属性的访问。
- 原型链修改后,
instanceof和isPrototypeOf()的结果会随之更新 - 不能通过修改原型让对象“变成”某个类的实例(比如改了原型,
obj instanceof MyClass仍为 false,除非原型链中包含MyClass.prototype) - 若新原型是 null,该对象将不再继承任何东西(连
Object.prototype都没有),需谨慎使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










