JavaScript对象的两类属性(数据属性与访问器属性)

时间:2021-12-01 16:36:14

对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property)。

第一类属性数据属性具有四个特征。

value:就是属性的值。

writable:决定属性能否被赋值。

enumerable:决定for in能否枚举该属性。

configurable:决定该属性能否被删除或者改变特征值。

在大多数情况下,我们只关心数据属性的值即可。

第二类属性是访问器(getter/setter)属性,它也有四个特征。

getter:函数或undefined,在取属性值时被调用。

setter:函数或undefined,在设置属性值时被调用。

enumerable:决定for in能否枚举该属性。

configurable:决定该属性能否被删除或者改变特征值。

我们通常用于定义属性的代码会产生数据属性,

其中的writable、enumerable、configurable都默认为 true。

我们可以使用内置函数 Object.getOwnPropertyDescripter来查看,

如以下代码所示:

var o = { a: 1 }; o.b = 2; //a和b皆为数据属性

Object.getOwnPropertyDescriptor(o,"a") // {value: 1, writable: true, enumerable: true, configurable: true}

Object.getOwnPropertyDescriptor(o,"b") // {value: 2, writable: true, enumerable: true, configurable: true}

这里使用了两种语法来定义属性,定义完属性后,我们用JavaScript的API来查看这个属性,

我们可以发现,这样定义出来的属性都是数据属性,writeable、enumerable、configurable都是默认值为true。

如果我们要想改变属性的特征,或者定义访问器属性,我们可以使用 Object.defineProperty,示例如下:

var o = { a: 1 }; Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true}); //a和b都是数据属性,但特征值变化了

Object.getOwnPropertyDescriptor(o,"a"); // {value: 1, writable: true, enumerable: true, configurable: true}

Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: true}

o.b = 3; console.log(o.b); // 2

使用了Object.defineProperty来定义属性,这样定义属性可以改变属性的writable和enumerable。

我们同样用Object.getOwnPropertyDescriptor来查看,发现确实改变了writable和enumerable特征。因为writable特征为false,所以我们重新对b赋值,b的值不会发生变化。

在创建对象时,也可以使用 get 和 set 关键字来创建访问器属性,代码如下所示:

var o = { get a() { return 1 } };

console.log(o.a); // 1

访问器属性跟数据属性不同,每次访问属性都会执行getter或者setter函数。这里我们的getter函数返回了1,所以o.a每次都得到1。

JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者Symbol(es6出现新的Symbol类型)为key,以数据属性特征值或者访问器属性特征值为value。

现在js有7大类型:underfined,null,number,String,Boolean,Object,和Symbol这7大语言类型。