ECMAScript中的两种属性

数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性一般用于存储数据数值。

数据属性有4个描述其行为的特征。

  • configurable:true/false,是否可以通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认false;

  • enumerable:true/false,是否可以通过for in循环返回,默认false;

  • writable:true/false,是否可以修改属性的值,默认false;

  • value:undefined,设置属性的值,默认undefined。

要修改默认的特性,就必须使用Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性名字和一个描述符对象。其中,描述符对象的属性必须是:configurable、enumerable、writable和value。设置其中的一或多个值,可以修改对应的特性值。

var person = {};
Object.defineProperty(person,"name",{
	writable:false,
	value:"hh"
});
console.log(person.name);//hh
person.name = "dd";
console.log(person.name);//hh

因为writable属性是只读的,所以不可以修改。在非严格模式下操作会被忽略,严格模式下会报错。

类似的规则也适合于不可配置的属性

var person = {};
Object.defineProperty(person,"name",{
	configurable:false,
	value:"hh"
});
console.log(person.name);//hh
delete person.name;
console.log(person.name);//hh

一旦把属性设置为不可配置,就不可以把它变回可配置了,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误:

var person = {};
Object.defineProperty(person,"name",{
	configurable:false,
	value:"hh"
});
//抛出错误
Object.defineProperty(person,"name",{
	configurable:true,
	value:"hh"
});

也就是说,可以多次调用Object.defineProperty()方法修改同一个属性,但在把configurable特性设置为false之后就会有限制了。

访问器属性

访问器属性不包括数值,它们包含一对getter和setter函数(但这两个函数都不是必须的),在读取访问器属性的时候,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性的时候,会调用setter函数并传入新值,这个函数决定如何处理数据。

访问其属性有4个描述其行为的特征。

  • configurable:true/false,是否可以通过delete删除属性,能否修改属性的特性,能否把属性修改为访问器属性,默认false;

  • enumerable:true/false,是否可以通过for in循环返回,默认false;

  • set:function,读取属性值时调用的函数;

  • get:function,修改属性值时调用的函数。

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,edition0);//2

—_year是一种常用的记号,用于表示只能通过对象方法访问的属性。

这个例子是用访问器属性的常见方法,即设置一个属性的值会导致其他属性发生变化。

原文地址:https://www.cnblogs.com/huyuzhu/p/6644046.html