javascript面向对象 - 理解

来源:互联网 发布:蛐蛐饲料 淘宝 编辑:程序博客网 时间:2024/05/27 20:03
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;//falsedescriptor.value;//2004
















1 0
原创粉丝点击