javascript之面向对象的程序设计——属性类型

面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。而ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。

ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”对象的每个属性或方法都有一个名字,而每个名字都映射到一个值,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函数。可能理解文字含义比较绕,所以直接看代码会能直观的理解什么是对象。每个对象都是基于一个引用类型创建的。

var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "software Engineer";
person.sayName = function(){
alert(this.name);
};

早期的Javascript开发人员经常使用这个模式创建新对象。几年后,对象字面量成为创建这种对象的首选模式。上面的代码用对象字面量语法可以写成这样:

var person = {
name:"Nicholas",
age:29,
job:"software Engineer",
sayName:function(){
alert(this.name);
    }
};

唯美风景
属性类型

ECMAScript中有两种属性:数据属性和访问器属性

1.数据属性:包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个描述其行为的特性,分别是:

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改成访问器属性,特性值为boolean类型(true或false)。

[[Enumerable]]:表示能否通过for-in循环返回属性,特性值为boolean类型(true或false)。

[[Writable]]:表示能否修改属性的值,特性值为boolean类型(true或false)。

[[Value]]:包含这个属性的数据值。默认值为undefined。

对于上面的例子中那样直接在对象上定义的属性,它们的[[Configurable]]、[[Enumerable]]、[[Writable]]都被设置为true,而[[Value]]被设置为指定的值。在直接点说,就是age这个属性的[[Configurable]]、[[Enumerable]]、[[Writable]]都被设置为true,而[[Value]]被设置为29。

要修改属性默认的特性。必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中描述符对象的属性必须是Configurable、Enumerable、Writable和Value中的一个或者多个,修改对于的特性值。例如

var person={};
Object.defineProperty(person,"name",{
    Writable:false,
    Value:"Nicholas"
});
alert(person.name);   //"Nicholas"
person.name = "Greg";
alert(person.name);   //"Nicholas"

这个例子创建了一个名为name的属性,它的值“Nicholas”是只读。这个属性的值是不可修改的。

注意:在调用Object.defineProperty()方法创建一个新的属性时,如果不指定,Configurable、Enumberable和Writable特性的默认值都是false。如果调用Object.defineProperty()方法只是修改已定义属性的特性,则无此限制。多数情况下,可能都没有必要利用Object.defineProperty()方法提供的这些高级功能。

书本意境

2.访问属性:访问器属性不包含数据值,他们包含一对儿getter和setter函数(这两个函数都不是必需的)。在读取访问器属性时,会调用getter函数,返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。

访问器属性也是有[[Configurable]]、[[Enumberable]]、[[Get]]和[[Set]]4个特性。前两个和数据属性一样,都是表示能否通过deleta删除,和能否通过for-in循环返回值。

[[Get]]:在读取属性时调用的函数。默认值为undefined。

[[Set]]:在写入属性时调用的函数。默认值为undefined。

访问器属性不能直接定义,必须使用Object.defineProperty()来方法来定义。例如:

var book = {       //定义两个默认属性_year和edition
  _year:2004,          //_year前面带_是一种常用的记号,表示只能通过对象方法访问的属性
  edition:1
};
Object.defineproperty(book,"year",{
  get:function(){             //返回_year的值
     return this._year;      
  },
  set:function(newValue){            //通过计算来确定正确的版本
     if(newVlaue>2004){
        this._year =newValue;
        this.edition += newValue - 2004;
      }
  }

});
book.year =2005;            
alert(book.edition);   //2

把year的属性修改为2005会导致_year变成2005,而edition变为2.这是使用访问器属性的常见方式,即设置一个属性的值会导致其他属性的变化。

不一定非要同时制定getter和setter。只指定getter意味着属性是不能写入;只指定setter意味着属性是不能读取。

陈健的个人博客,记录生活所见所感、学习笔记。专注于Web前端_SEO教程_读书心得。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回主页看更多
狠狠的抽打博主 支付宝 扫一扫