MST

星途 面试题库

面试题:JavaScript对象可扩展能力在继承场景下的挑战

假设有一个基于原型链继承的对象体系,其中父对象设置为不可扩展。当子对象试图添加新属性时会发生什么?如何突破这种限制来满足子对象添加属性的需求?请阐述原理并给出代码实现。
31.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 子对象试图添加新属性时的情况
    • 当父对象设置为不可扩展(使用Object.preventExtensions方法),子对象通过原型链继承自该父对象。如果直接在子对象上尝试添加新属性,并且该属性不存在于原型链上已有的属性中,在严格模式下会抛出TypeError,在非严格模式下,该操作会被默默忽略。这是因为对象不可扩展意味着不能再为其添加新属性。
  2. 突破限制满足子对象添加属性需求的原理及实现
    • 原理:可以通过创建一个新的对象作为子对象的原型,这个新原型不继承自不可扩展的父对象,然后在这个新原型上添加属性,这样就可以绕过父对象不可扩展的限制。
    • 代码实现
// 创建不可扩展的父对象
const parent = {
    name: 'parent'
};
Object.preventExtensions(parent);

// 创建新的原型对象
const newProto = {};
// 在新原型对象上添加属性
newProto.newProp = 'new property';

// 创建子对象,使其原型为新原型对象
const child = Object.create(newProto);

console.log(child.newProp); // 输出: new property