JavaScript ES5 数据属性与访问器属性详解
本文详细解析JavaScript ES5中的两种对象属性:数据属性与访问器属性。重点介绍Object.defineProperty方法及其描述符对象(value, writable, enumerable, configurable, get, set)的具体行为与默认值。通过实例演示如何创建只读、只写或读写属性,并探讨属性特性的限制与删除操作。
数据属性与访问器属性概述
在ES5标准中,对象的属性主要划分为两类:数据属性和访问器属性。
数据属性主要用于存储具体的数值或对象引用,而访问器属性则不直接存储数据,而是通过set和get操作来定义数据的读取与写入行为。
数据属性的四个特性
数据属性包含四个内部特性:value、writable、enumerable和configurable。
其中,configurable特性决定了该属性是否可以通过delete语句删除,是否允许修改其特性,以及能否将其从数据属性转换为访问器属性。该特性的默认值为false。
enumerable特性控制该属性是否可被for-in循环枚举返回,默认值为false。
writable特性决定属性的值是否可被修改,默认值为false。
value特性用于存储属性的实际值,默认值为undefined。
访问器属性的特性定义
访问器属性同样包含四个特性:get、set、enumerable和configurable。
与数据属性类似,configurable特性控制属性的删除、特性修改及类型转换权限,默认值为false。
enumerable特性控制属性是否参与for-in循环枚举,默认值为false。
set是一个函数,当尝试修改属性值时调用该函数。
get是一个函数,当读取属性值时调用该函数以返回结果。
Object.defineProperty方法详解
要向对象添加新属性或修改现有属性的特性,需使用Object.defineProperty()或Object.defineProperties()方法。
Object.defineProperty(object, propertyname, descriptor)方法的语法如下:
参数object指定需要添加或修改属性的目标对象。
参数propertyname为字符串格式,指定要定义或修改的属性的名称。
参数descriptor为描述符对象,用于设置数据属性或访问器属性的具体特性。
以下通过实例分析数据属性的行为:
在代码示例a0中,首先创建一个包含name属性的对象emp。随后使用Object.defineProperty将name属性的writable设为false。尝试修改emp.name为'jery'时,由于writable为false,值保持不变,console.log输出'tom'。接着定义age属性,设置configurable为false,writable为true,value为22。此时读取age输出22;修改age为25后输出25,因为writable允许修改。然而,尝试使用delete删除age属性时,由于configurable为false,删除操作无效,console.log仍输出25。
数据属性实例分析
var emp = {
name:'tom'
};
Object.defineProperty(emp,'name',{
writable:false
});
emp.name = 'jery';
console.log(emp.name);//输出tom,因为已经设置了writable为false
Object.defineProperty(emp,'age',{
configurable:false,
writable:true,
value:22
});
console.log(emp.age);//输出22,因为设置了value为22
emp.age = 25;
console.log(emp.age);//输出25,设置了writable为true
delete emp.age;
console.log(emp.age);//输出25,设置了configurable为false,此属性删除不了
以下通过实例分析访问器属性的行为:
访问器属性实例分析
var emp ={
_name:'tom',
_age:20
};
Object.defineProperty(emp,'name',{
get:function(){
return this._name;
}
});
console.log(emp.name);//输出tom,由get方法返回_name的值
emp.name = 'jery';
console.log(emp.name);//输出tom,没有set方法,修改不了_name的值
Object.defineProperty(emp,'age',{
configurable:true,
get:function(){
return this._age;
}
set:function(age){
this._age = age;
}
});
emp.age = 25;
console.log(emp.age)//输出25,emp.age=25是使用set方法将25赋值给_age,emp.age是使用get方法将_age的读取出来
delete emp.age;
console.log(emp.age);//输出undefined,configurable为true,可以使用delete方法将emp.age属性删除
访问器属性常用于实现数据保护机制:若仅定义get方法,则形成只读属性;若仅定义set方法,则形成只写属性。
在代码示例a1中,创建包含_name和_age内部属性的对象emp。定义name访问器属性,仅包含get方法,返回this._name。读取emp.name输出'tom';尝试赋值'jery'时,因无set方法,内部值不变,读取仍为'tom'。定义age访问器属性,设置configurable为true,包含get和set方法。get返回this._age,set将传入值赋给this._age。执行emp.age = 25调用set方法,读取emp.age调用get方法,输出25。由于configurable为true,使用delete删除age属性成功,再次读取输出undefined。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
