Js面向对象程序设计——属性类型,访问器属性

Js面向对象程序设计——属性类型,访问器属性

访问器属性

  • 访问器属性不包含数据值;它们包含一对儿getter和setter函数(不过,这俩个函数都不是必需的)。在读取访问器属性时,回调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,回调用setter函数并传入新值,这个函数负责决定如何处理数据。访问器有如下几个特性:
  1. [[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。
  2. [[Enumerable]]:表示能否通过for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。
  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;
			}
		}
	});
console.log(book.year)//2004
book.year = 2005;
console.log(book.year)//2005
console.log(book.edition)//2
				
  • 以上代码创建了一个book对象,并给它定义俩个默认的属性:_year和edition。_year前面的下划线时一种常用的记号,用于表示只能通过对象方法访问的属性。而访问器属性year则包含一个getter函数和一个setter函数。getter函数返回_year的值,settter函数通过计算来确定正确的版本。因此,把year属性修改为2005会导致_year变成2005,而edition变为2.这是使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化。
  • 不一定非要同时指定getter和setter。值指定getter意味着属性是不能写,尝试写入属性会被忽略。在严格模式下,尝试写入只指定了getter函数的属性会抛出错误。类似的,没有指定setter函数的属性也不能读,否则在非严格模式下会返回undefined,而在严格模式下会抛出错误。

参考红宝书

猜你喜欢

转载自blog.csdn.net/zhaostrong/article/details/86080503