面向对象【2】:创建对象

164 阅读2分钟

一、工厂模式

用函数来封装以特定接口创建对象的细节

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 Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

二、构造函数模式

通过构造函数来创建的对象,可以

function Person(name, age, job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function(){
 alert(this.name);
 };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor"); 
  1. Person()中的代码除了与 createPerson()中相同的部分外,还存在以下不同之处:

    • 没有显式地创建对象;
    • 直接将属性和方法赋给了 this 对象;
    • 没有 return 语句。
  2. 函数名 Person 使用的是大写字母 P。按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

  3. 要创建 Person 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4 个步骤:

    • 创建一个新对象;
    • 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
    • 执行构造函数中的代码(为这个新对象添加属性);
    • 返回新对象。
  4. 在前面例子的最后,person1 和 person2 分别保存着 Person 的一个不同的实例。这两个对象都有一个 constructor(构造函数)属性,该属性指向 Person,如下所示。

alert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true
  1. 对象的 constructor 属性最初是用来标识对象类型的。但是,提到检测对象类型,还是 instanceof 操作符要更可靠一些。我们在这个例子中创建的所有对象既是 Object 的实例,同时也是 Person 的实例,这一点通过 instanceof 操作符可以得到验证。
alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true