javascript面向对象 - 理解

javascript 没有类的概念,所以,在我的理解中,javascript的对象,可以理解为类,因为既可以定义属性又可以定义方法。 JS在OOP(面向对象)中,访问器属性是面向对象的重要表现,它可以设置对象的私有属性。因为在面向对象中,可能需要在对象属性设值前或者设置后进行一系列的逻辑操作。

1.对象的属性 
对象的属性分为数据属性和访问器属性。
defineProperties可以设置属性的配置,例如如何赋值,如何返回,是否允许被for in遍历,不过这多半是用在oop中的。
configurable:表示能否修改删除操作属性。
enumerable:表示能否通过for-in循环返回属性。
writable:表示能否修改属性值。
value:表示包含这个属性的数据值。
修改属性默认的特性(即可以规定该对象是否能修改,可读等操作。)
Object.defineProperty()方法,接收三个参数:属性堆在对象、属性名字和描述符对象。其中,描述符对象必须是:configurable、enumerable、writable 和value。设置其中一个或者多个值,可以修改对应的特性值。
例如:
var per = {}
Object.defineProperty(per,"name",{
writable:false,
value:"lili"
});



2.访问器属性 get()/set()
访问器属性不包含任何数值,他们包含一对 get() 和set() 函数。在读取访问器属性时候,会调用get()函数,访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
var perpeo={_born:1990,age:1};
Object.defineProperty(perpeo,"born",{
get:function(){ return this_born; },
set:function (newValue){ if(newValue > 1990){ this._born=newValue; this.age +=newValue -1990; }
}
});
perpeo.born=2005;
perpeo.age

代码解释:
首先创建一个perpeo对象,并给它定义两个默认属性: _born 和 age 。_born前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性。而访问器属性 born 则包含一个getter 函数 和一个setter函数。getter函数返回 _born的值 , setter 函数通过计算确定正确的age。

3.定义访问属性Object.defineProperty()
可以通过Object.defineProperties()一次定义多个属性,这方法接收两个参数,第一个参数对象是要添加和修改属性的对象,第二个对象的属性,与第一个对象要添加或修改的属性对应。
例如
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;
          }
     }
}
});


这里book定义两个数据属性(_year 和 edition)和一个访问器类型(year);

4.读取属性的特性Object.getOwnPropertyDescriptor( )
使用Object.getOwnPropertyDescriptor()方法,可以接收两个参数:属性所在的对象和要读取其描述符的属性名称。
Object.getOwnPropertyDescriptor()方法,返回的结果是一个对象。
如果这个是访问器属性,这个对象的属性又configurable、enumerable、get和set。
如果这个对象是数据属性,这个对象有configurable、enumerable、writable和value。
在JS中,可以针对任何对象使用Object.getOwnPropertyDescriptor(),包括DOM对象和BOM对象。

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");
descriptor.configurable;//false
descriptor.value;//2004
















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Draven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值