标签:
ES有两种属性类型:数据属性和访问器属性。
一、数据属性4个描述其行为的特性。
1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。
2: [[Enumerable]]:表示能否通过for-in循环返回属性
3: [[Writable]]:表示能否修改属性的值
4:[[Value]]:包含这个属性的属性值
要修改属性默认的特性,必须使用ES5的defineProperty()方法
//"use strict"; var person = {}; Object.defineProperty(person,‘name‘,{ writable:false,//表示能否修改属性的值为true的话可以修改 默认false value:"Nicholas" }); console.log(person.name);//Nicholas person.name = "Grey";//严格模式下会报错 console.log(person.name);//Nicholas true的情况下"Grey"
// "use strict"; var person = {}; Object.defineProperty(person,‘name‘,{ configurable:true,//表示不能删除对象中的属性 默认为true value:"Nicholas" }); console.log(person.name);//Nicholas delete person.name;//严格模式下会报错 console.log(person.name);//Nicholas
//"use strict"; var person = {}; Object.defineProperty(person,‘name‘,{ configurable:false,//表示不能删除对象中的属性 value:"Nicholas" }); //抛出错误 Object.defineProperty(person,‘name‘,{ configurable:true,//一旦把属性定义为不可配置,就不能再把他变回可配置 value:"Nicholas" });
二:访问器属性 不包含数据值,他们包含一对getter和setter函数 但是不是必须的
1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。
2: [[Enumerable]]:表示能否通过for-in循环返回属性
3: [[Get]]:在读取属性时调用的函数。默认为undefined。
4: [[Set]]:在写入属性时调用的函数。默认值为undefined。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义、
var book = { _year:2004, edition:1 }; Object.defineProperty(book,‘year‘,{ get:function(){ return this._year; }, set:function(newValue){ if (newValue>2004) { this._year = newValue; this.edition += newValue - 2004; } } }) book.year = 2005; console.log(book.edition);//2
_year前面的下划线是一种常用的记号,用于表示对象方法访问的属性。而访问器属性year则包含一个getter和setter的函数。getter函数返回_year的值。而setter函数通过计算来确定正确的版本。
var book = {}; Object.defineProperties(book,{//定义多个属性记得用复数 _year:{ value:2004 }, edition:{ value:1 }, year:{ get:function(){ return this._year; }, set:function(newValue){ if (newValue>2004) { this._year = newValue; this.edition += newValue -2004 } } } } ) var descriptor = Object.getOwnPropertyDescriptor(book,"_year");//数据属性 console.log(descriptor.value);//2004 console.log(descriptor.configurable);//false console.log(descriptor.get);//underfined var descriptor = Object.getOwnPropertyDescriptor(book,"year");//访问器属性 console.log(descriptor.value);//underfined console.log(descriptor.enumerable);//false console.log(descriptor.get);//[Function: get]
标签:
原文地址:http://www.cnblogs.com/mr-pz/p/5906930.html