面向对象的程序设计

12 Apr 2014


ECMA-262把对象定义为:“无序属性地集合,其属性可以包括基本值、对象或者函数”。对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。

创建对象

每个对象都是基于一个引用类型创建的。

创建自定义对象的最简单方式就是创建一个Object的实例,然后再为它添加属性和方法,如下所示:

  var person = new Object();
  person.name = "Nicholas";
  person.age = 29;
  person.job = "Software Engineer";

  person.sayName = function(){
   alert(this.name)
  };

  person.sayName()

对象字面量

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

以上这种创建新对象的方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。为解决这个问题人们开始使用工厂模式的一种变体。

工厂模式

用函数来封装以特定接口创建对象的细节,如下面的例子所示:

  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('jane','28','web-developer');
  person1.sayName();

工厂模式,虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。又出现了一个新的模式。

构造函数模式