JavaScript ES5 数据属性与访问器属性详解

作者:异步漫步时间:2026-10-30 11:10:45浏览:520

本文详细解析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。

作者最新文章