JavsScript属性类型

JavsScript属性类型

数据属性

数据属性包含一个数值的位置,这个位置可以读取和写入数值。它有4个描述其行为的特性:
[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,默认值为true
[[Enumerable]]:表示能否通过 for-in 循环返回属性。默认值为true
[[Writable]]:表示能否修改属性的值。默认值为true
[[Value]]:包含这个属性的数据值。默认值为undefined
(具体细节详见《JavaScript高级程序设计(第4版)》第139页)
在ES5中,要修改属性默认的特性必须使用Objext.defineProperty(obj, prop, descriptor)方法。其中描述符对象(descriptor)的属相必须是:configurable,enumerable,writable和value。

访问器属性

访问器属性不包含数据值,而是包含一个getter属性和一个setter属性(但这两个属性并不是非要同时设定)。在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter 函数并传入新值,这个函数负责决定如何处理数据。访问器属性有如下 4 个特性。
[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。
[[Enumerable]]:表示能否通过 for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为 true。
[[Get]]:在读取属性时调用的函数。默认值为 undefined。
[[Set]]:在写入属性时调用的函数。默认值为 undefined。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var book={
_year:2004,//_year是通过对象方法访问的属性。
edition:1
};
Object.defineProperty(book,"year",{//year是一个访问器属性,包含一个getter函数和setter函数。
get: function(){//读取属性时调用的函数,设置get表示允许读,此处表示以this._year的值返回this.year的值
return this._year;
},
set: function(newValue){//在写入属性时调用的函数,设置set表示允许写入,即允许对原对象属性做相关操作
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year=2005;//把year属性修改为2005会导致_year变成2005,而edition变成2
console.log(book._year + '年出第' + book.edition + '版'); //2005年出第2版

以上代码创建了一个 book 对象,并给它定义两个默认的属性: _year和edition。_year前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性。还定义了一个访问器属性year,包含一个getter函数和一个setter函数。getter函数返回_year的值,setter函数通过计算来确定正确的版本。因此,把 year属性修改为 2005会导致_year变成 2005,而 edition变为 2。这是使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化。具体测试过程见自己总结的CH6Attributies.js


版权声明:本文作者为「Andy8421」.本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!