@frank-shaw
2017-02-09T08:33:17.000000Z
字数 1054
阅读 1789
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, {}, {});
