MST

星途 面试题库

面试题:JavaScript中如何通过属性特性实现数据的封装与访问控制

在JavaScript里,属性特性如`configurable`、`enumerable`、`writable`和`value`等用于控制属性的行为。请说明如何利用这些特性实现类似其他语言中数据封装与访问控制的效果,比如限制对对象内部数据的直接修改。并举例写出代码实现一个简单的数据封装,包含一个私有属性和公开的访问方法。
33.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

在JavaScript中,可以使用Object.defineProperty()方法来设置属性特性,从而实现类似其他语言中数据封装与访问控制的效果。以下是实现一个简单的数据封装,包含一个私有属性和公开的访问方法的示例代码:

const myObject = (function() {
    let privateValue = 0; // 私有属性

    function getValue() {
        return privateValue;
    }

    function setValue(newValue) {
        if (typeof newValue === 'number' && newValue >= 0) {
            privateValue = newValue;
        } else {
            console.error('Invalid value. Value must be a non - negative number.');
        }
    }

    return {
        getValue: getValue,
        setValue: setValue
    };
})();

// 使用Object.defineProperty定义公开的访问方法,并设置属性特性
Object.defineProperty(myObject, 'value', {
    get: myObject.getValue,
    set: myObject.setValue,
    enumerable: true,
    configurable: false
});

// 测试代码
console.log(myObject.value); // 输出: 0
myObject.value = 10;
console.log(myObject.value); // 输出: 10
myObject.value = -5; // 输出: Invalid value. Value must be a non - negative number.

解释:

  1. 私有属性:通过闭包,在立即执行函数内部定义privateValue变量,外部无法直接访问。
  2. 公开访问方法:定义getValuesetValue函数来访问和修改私有属性。
  3. 属性特性:使用Object.defineProperty定义myObjectvalue属性,通过getset方法来间接访问和修改私有属性,设置enumerabletrue使得该属性可枚举,configurablefalse防止该属性被删除或重新定义。这样就限制了对对象内部数据的直接修改,实现了数据封装与访问控制。