原型式继承通过原型链实现属性读取共享与写入实例隔离:读取时沿原型链查找,写入默认创建/修改实例自身属性,从而支持默认值统一管理和运行时策略下发。

原型式继承本身不直接“添加属性”,但它让动态添加属性这件事更灵活、更可复用——关键在于:属性查找走原型链,而写操作默认只作用于实例自身。
属性读取走原型链,写入默认落在实例上
当你访问一个对象的属性时,JavaScript 会从实例开始,逐级向上查原型链,直到找到该属性或抵达 null。但当你给对象赋值(如 obj.name = "Alice"),只要该属性不是 setter,引擎就会在 实例自身 创建或修改这个属性,不会动原型上的同名属性。
这意味着:
- 未设置的属性自动从原型链获取(体现“继承”)
- 设置后,实例拥有了自己的副本,从此屏蔽原型上的同名属性(体现“覆盖”)
- 原型上的通用配置(如
required: true、maxLength: 100)保持干净,多个实例共享,改一处即全局生效
用 Object.create() 构建带原型的对象实例
这是最清晰、最推荐的动态继承起点。它明确指定新对象的原型,后续所有属性操作都基于这个链路:
const baseConfig = { required: true, disabled: false };-
const inputA = Object.create(baseConfig);→inputA原型是baseConfig -
inputA.label = "用户名";→ 新增自有属性,不影响原型 -
inputA.required = false;→ 覆盖原型值,仅影响inputA -
console.log(inputA.disabled);→ 仍输出false(来自原型)
运行时修改原型,影响所有未覆盖的实例
因为属性查找是实时的,所以改原型上的值,所有没在自身定义该属性的实例都会立即看到变化:
baseConfig.placeholder = "请输入内容";- 之前创建的
inputA、inputB若都没设placeholder,下一次读取就返回新值 - 已设
inputA.placeholder = "用户名"的实例则不受影响
这种机制天然支持低代码场景中的“默认值统一管理”和“运行时策略下发”。
注意边界:delete 只删自有属性,无法删原型属性
如果你想让某个实例重新“恢复”使用原型值,不能靠 delete obj.prop 后再改原型——因为 delete 只能移除实例自身的属性,之后读取仍会继续向上找原型。真正要“退回原型值”,只需确保实例上没有该属性即可:
- 新建实例自然无该属性,直接走原型
- 已有实例可用
delete obj.prop清除自有值,之后查找自动回落到原型 - 但无法通过任何方式删除原型对象上的属性来影响其他实例(除非你主动改原型)











