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