JavaScript面向对象编程——数据属性与访问器属性
本篇博文完全借鉴了JavaScript高级程序语言设计(第3版)第6章,是博主为了更好理解的第6章知识点,从而对其进行的归纳总结。
-
对象
在ECMScript中,对象的每个属性或方法都有一个名字,而每个名字都映射到一个值,所以对象无非就是一组名值对的集合,其中值可以是数据或者函数。以下就创建一个person对象,在这个对象中有3个属性,name,age,sayName方法。var person={ name:"zhang san", age:29, sayName:function(){ alert(this.name); } }
上面创建对象的形式叫做对象字面量模式,这是创建对象的首选模式
-
属性类型
描述对象属性的各种特征,分为数据属性和访问器属性-
数据属性
Configurable:表示能否通过delete删除属性,能否修改属性的特性,或者能否把属性修改为访问器属性。对于直接在对象上定义的属性,这个特性值默认值为ture。
Enumerable:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性值默认值为ture。
Writable:能否修改属性的值。对于直接在对象上定义的属性,这个特性值默认值为ture。
Value:属性的数据值。读取属性的时候,从这个位置开始读;写入属性的时候把新值保存在这个位置。这个特性的默认值是undefined。
Object.defineProperty():这个方法用于修改属性的特性,该方法接受三个参数:属性所在的对象、属性名字、描述符对象,描述符必须是:configurable、enumerable、writable、value。设置其中一个或者多个值,可以修改对应的特性。如:var person={} Object.defineProperty(person,"name",{ writable:false,//不能修改属性值 value:"zhang san"//数据值为zhang san }) alert(person.name); //"zhang san" person.name="li si"; alert(person.name); //"zhang san"
以上代码 在非严格模式下,修改无效什么都不会发生,但严格模式下会报错。
注:
1.configurable是十分特殊的一个描述符,该描述符如果设定成false,如果要在之后对configurable、enumerable、value 这三个描述符的属性进行修改,在非严格模式下什么也不会发生,修改无效,在严格模式下则会报错。
2.在使用Object.defineProperty()创建新的属性的时候,如果不指定configurable、enumerable、writable,则默认值为false。如果用Object.defineProperty()修改对象已定义的属性的特性,则无此限制。 -
访问器属性
访问器属性不包含数据值;只有一对getter和setter函数,在读取访问器属性时会调用getter函数,该函数负责返回有效的值;在写入访问器属性时会调用setter函数,该函数负责决定如何处理数据。Configurable:表示能否通过delete删除属性,能否修改属性的特性,或者能否把属性修改为访问器属性。对于直接在对象上定义的属性,这个特性值默认值为ture。
Enumerable:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性值默认值为ture。
Get:在读取属性时调用的函数。默认值undefined
Set:在写入属性时调用的函数。默认值undefined
访问器属性不能直接定义,要通过Object.defineProperty()来定义,如var book= { _year:2004,// _year的下划线,表示只能通过对象访问的属性 editon:1 }; Object.defineProperty(book,"year",{ get:function() { return this._year; }, set:function() { if(nweValue>2004) { this._year=newValue; this._edition+=newValue-2004; } } }); book.year=2005; alert(book.edition)//20
访问器属性year包含一个getter和setter函数,getter函数返回_year的值,setter通过计算来确定正确的版本,因此,改变year的值变为2500会导致_year变为2005,eidtion变为2.这是使用访问器属性常见的方式,设置一个属性的值会导致其他属性发生变化。
定义多个属性var booke={} Object.defineProperty(book, { _year:{ writable:true, value:2005 }, year:{ get:function() { return this._year; }, set:function() { if(nweValue>2004) { this._year=newValue; } } } });
Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述副。接收两个参数:属性所在对象和要读取其描述符的属性名称。返回值是一个对象。
var booke={} Object.defineProperty(book, { _year:{ writable:true, value:2005 }, year:{ get:function() { return this._year; }, set:function() { if(nweValue>2004) { this._year=newValue; } } } }); var descriptor=Object.getOwnPropertyDescriptor(book,_year) alert(descriptor.value) //2005 alert(descriptor.configurable) //false alert(descriptor.get) //undefined var descriptor=Object.getOwnPropertyDescriptor(book,year) alert(typeof descriptor.get) //function
-