MST

星途 面试题库

面试题:JavaScript中对象可扩展能力的基础限制

在JavaScript中,如何设置一个对象为不可扩展?设置后会对对象产生哪些限制?请用代码示例说明。
28.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 设置对象为不可扩展的方法: 在JavaScript中,可以使用Object.preventExtensions()方法来设置一个对象为不可扩展。一旦一个对象被设置为不可扩展,就不能再为它添加新的属性。
  2. 代码示例
// 创建一个普通对象
let myObject = {name: 'John'};

// 设置对象为不可扩展
Object.preventExtensions(myObject);

// 尝试添加新属性
myObject.age = 30;

// 打印对象,会发现没有成功添加age属性
console.log(myObject);
  1. 设置后对对象产生的限制
    • 不能添加新属性:如上述代码中,尝试为不可扩展的myObject添加age属性,操作不会成功。
    • 属性描述符和原型的限制:虽然不能添加新属性,但现有属性的描述符(如configurableenumerablewritable等)和对象原型仍然可以修改,除非将属性描述符设置为configurable: false,或者将对象的原型设置为null 。例如:
let obj = {a: 1};
Object.preventExtensions(obj);
// 现有属性描述符可修改
Object.defineProperty(obj, 'a', {writable: false});
console.log(obj.a);
// 可以修改原型
obj.__proto__ = {b: 2};
console.log(obj.b);

如果想完全冻结对象(包括防止修改属性描述符和原型),可以使用Object.freeze()方法。

let frozenObj = {c: 3};
Object.freeze(frozenObj);
// 尝试修改属性描述符
Object.defineProperty(frozenObj, 'c', {writable: false});
// 尝试修改原型
frozenObj.__proto__ = {d: 4};
console.log(frozenObj);

在上述代码中,对冻结对象的属性描述符修改和原型修改都不会生效。