@frank-shaw
2017-02-09T16:33:17.000000Z
字数 1054
阅读 1476
javaScript
ECMA-262将对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”现在来聊聊对象中的各个属性所持有的一些特征。属性的特征主要有两种:数据特征、访问器特征。
数据特征具体包含了四个:
[[Configurable]]:该属性是否可删除、是否可修改该属性的特征(起到一个统帅的作用)默认true
[[Enumerable]]:该属性是否可以通过for-in循环返回 默认true
[[Writable]]:表示属性是否可写入(可修改)默认true
[[Value]]:表示的是属性具体的值 默认undefined
下面来看例子:
var person={}
Object.defineProperty(person, "name", {
writable:false,
value:"frank"
});
alert(person.name);//'frank'
person.name='kobe';
alert(person.name);//'frank'
在定义对象属性的时候,赋予name属性的value特征为‘frank',同时writable特征为false。表明person.name是不可修改的。
访问器特征具体包含了四个:
[[Configurable]]:该属性是否可删除、是否可修改该属性的特征(起到一个统帅的作用)默认true
[[Enumerable]]:该属性是否可以通过for-in循环返回 默认true
[[Get]]:在读取该属性时调用的函数 默认undefined
[[Set]]:在写入该属性时调用的函数 默认undefined
同样看例子:
var book = {
_year:2016,
edition:1
}
Object.getProperty(book,"year",{
get: function(){
return this._year;
},
set: function(newValue){
if(newValue>2016){
this._year=newValue;
this.edition += newValue-2016;
}
}
});
book.year=2017;
alert(book.edition); //2
值得注意的是:
1.不一定非要同时制定getter和setter。只指定getter意味着该属性不能写,尝试写入会被忽略。反之亦然。
2.如果要同时定义多个属性,那么可以使用Object.defineProperties(obj, {}, {});