首页 > 代码库 > javascript高级编程笔记05(面向对象)

javascript高级编程笔记05(面向对象)

面向对象设计

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

  • 数据属性:

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

  1. [[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
  2. [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true
  3. [[Writable]]:表示能否修改属性的值,默认为true
  4. [[Value]]:包含这个属性的数据值默认为undefined

要修改属性默认的特性,必须使用es5object.defineProperty方法,这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象,其中,描述符对象的属性必须是:configurableenumerablewritablevalue,设置其中一个或多个值,可以修改对应的特性值,例如:

 

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

 

注意:ie8是第一个实现object.defineProperty方法的浏览器版本,然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性,由于实现不彻底,建议读者不要在ie8中使用此方法.

  • 访问器属性:

访问器属性不包含数据值;他们包含一对gettersetter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值,访问器属性有如下4个特性

  1. [[Confingurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性
  2. [[Enumerable]]:表示能否通过for-in循环返回属性.
  3. [[Get]]:在读取属性时调用的函数,默认值为undefined
  4. [[Set]]:在写入属性时调用的函数,默认为undefined

访问器属性不能直接定义,必须使用Objiect.defineProperty来定义.

  • l 定义多个属性

   由于未对象定义多个属性的可能性很大,es5又定义了一个Object.difineProperties方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数;第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应.

例如:

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;
      }
    }
  }
})
  • l 读取属性的特性

es5Object.getOwnPropertyDescriptor方法,可以取得给定属性的描述符,这个方法接收两个参数:属性所在的对象和要读取描述的属性名称,返回值是一个对象,如果是访问器属性,这个对象的属性有configurable,enumerable,getset;如果是数据属性,这个对象的属性有configurable,enumerable,writablevalue.例如:

 

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");
alert(descriptor.value)//2004
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//undefined

var descriptor=Object.getOwnPropertyDescriptor(book,"year");
alert(descriptor.value);//underfined
alert(descriptor.enumerable);//false
alert(typeof descriptor.get);//function

 

  • l 创建对象
  1. 工厂模式

工厂模式是软件工程领域一个广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在javascript中的实现).

 

function createPerson(name,age,job){
  var o=new Object();
  o.name=name;
  o.age=age;
  o.job=job;
  o.sayName=function(){
    alert(this.name);
  }
  return o;
}
var person1=createPerson("Nicholas",29,"Software Enginneer");
var person2=createPerson("Greg",27,"Doctor");

 

javascript高级编程笔记05(面向对象)