面试题答案
一键面试在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.
解释:
- 私有属性:通过闭包,在立即执行函数内部定义
privateValue
变量,外部无法直接访问。 - 公开访问方法:定义
getValue
和setValue
函数来访问和修改私有属性。 - 属性特性:使用
Object.defineProperty
定义myObject
的value
属性,通过get
和set
方法来间接访问和修改私有属性,设置enumerable
为true
使得该属性可枚举,configurable
为false
防止该属性被删除或重新定义。这样就限制了对对象内部数据的直接修改,实现了数据封装与访问控制。