JavaScript面向对象编程——数据属性与访问器属性

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
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值