JavaScript面向对象设计二 构造函数模式

 更新时间:2011年12月20日 01:23:05   作者:  
在Javascript面向对象设计一——工厂模式 中介绍了使用CreateEmployee()函数创建员工类。ECMAScript中的构造函数可以用来创建特定类型的对象,如Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中,此外也可以创建自定义的构造函数,从而创建自定义对象类型的属性和方法
我们将使用构造函数模式将工厂模式进行改写。
复制代码 代码如下:

function Employee(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
alert(this.name);
};
}
var Jim = new Employee("jim", 22, "SoftWare Engineer");
var Sun = new Employee("Sun", 24, "Doctor");
Jim.sayName();
Sun.sayName();

在以上代码中Employee函数取代了CreateEmployee函数,Employee中的代码与CreateEmployee中的代码不同如下:
没有显示的创建对象
直接将属性和方法赋给了this对象
没有return语句
要创建Employee类的新实例,必须使用new操作符,实际会经历四个步骤:
创建一个新对象
将构造函数的作用域赋给新的对象
执行构造函数中代码
返回新对象
以上代码最后Jim和Sun中分别保存着Employee的两个不同实例,这两个实例都有一个constructor(构造函数)属性,该属性指向Employee,可以做如下测试
复制代码 代码如下:

alert(Jim instanceof Employee); //true
alert(Sun instanceof Employee);//true

同时这两个对象又都是Object类型的,可通过如下代码检测。
复制代码 代码如下:

alert(Jim instanceof Object); //true
alert(Sun instanceof Object);//true

创建自定义的构造函数意味着将来可以把它的实例标石为一种特定的类型,而这也正是构造函数模式胜过工厂模式的地方。
下面详细讲解一下构造函数:
将构造函数当做函数
构造函数与其他函数的唯一区别就在于调用它们的方式不同。但是构造函数也是函数,不存在定义构造函数的特殊语法。其实,任何函数,只有通过new来调用,那他就可以作为构造函数,例如,Employee除了以上用new方法调用外,还可以用如下方式来调用。
复制代码 代码如下:

//作为普通函数调用
Employee("Sun", 28, "SoftWare Engineer"); //添加到window中
window.sayName();//Sun

复制代码 代码如下:
//在另一个对象的作用域中调用
var o = new Object();
Employee.call(o, "Sun", 28, "SoftWare Engineer");
o.sayName();//Sum

构造函数的问题
使用构造函数的主要问题就是都要在每个实力上重新创建一遍,以上两个对象中的sayName方法其实是不同的Function的实例,可以用如下方法证明:
alert(Jim.sayName == Sun.sayName);//false
但是创建两个完成同样任务的Function实例,所以我们对上面的函数进行改写,如下
复制代码 代码如下:

function Employee(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName =sayName;
}
function sayName() {
alert(this.name);
}

这样就解决了两个函数做同一件事情的问题,但是新的问题又会出现了,这个在全局作用域中定义的函数,实际上只能被某个对象引用,而且最要命的问题是,如果对象需要定义很多方法,那么就需要定义很多个全局函数,所以这个自定义的引用类型,就没有任何封装性可言了.

相关文章

  • Javascript 面向对象 (声明篇)

    Javascript 面向对象 (声明篇)

    有时间重新审视了遍 Javascript 的面向对象机制。与其他的语言不同,Javascript 可以说提供了更灵活的面向对象机制(比如 function 在完成其自身功能的同时也是对象)。
    2010-04-04
  • JavaScript 设计模式学习 Singleton

    JavaScript 设计模式学习 Singleton

    JavaScript设计模式学习 Singleton
    2009-07-07
  • javascript 面向对象 function类

    javascript 面向对象 function类

    javascript中的类是用函数function表示的
    2010-05-05
  • JavaScript 继承详解(三)

    JavaScript 继承详解(三)

    在第一章中,我们使用构造函数和原型的方式在JavaScript的世界中实现了类和继承, 但是存在很多问题。这一章我们将会逐一分析这些问题,并给出解决方案。
    2009-07-07
  • javascript 面向对象的JavaScript类

    javascript 面向对象的JavaScript类

    这一节来说下紧接着的一个概念——类。虽然JavaScript中没有class关键字,但作为开发人员我们一定要有这个思想。在C#中类可以分为实例类和静态类,JavaScript亦然。
    2010-05-05
  • JavaScript面向对象(极简主义法minimalist approach)

    JavaScript面向对象(极简主义法minimalist approach)

    荷兰程序员 Gabor de Mooij 提出了一种比 Object.create ()更好的新方法,他称这种方法为极简主义法(minimalist approach)。这也是我推荐的方法
    2012-07-07
  • JS 创建对象(常见的几种方法)

    JS 创建对象(常见的几种方法)

    方便学习js类的朋友,让你快速的掌握js类的定义方法,方法有很多种,结果都一样。大家可以根据自己的爱好选用。
    2008-11-11
  • JavaScript 继承详解(一)

    JavaScript 继承详解(一)

    几乎每个开发人员都有面向对象语言(比如C++、C#、Java)的开发经验。 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例。
    2009-07-07
  • javascript 面向对象编程  function是方法(函数)

    javascript 面向对象编程 function是方法(函数)

    在进行编程时,必免不了要碰到复杂的功能。初学者最怕复杂的功能,因为不能够很好的进行功能边界划分,只能一大串if、循环加case堆叠在一起,结果出来的程序自己看着晕,别人看着更晕。
    2009-09-09
  • 浅谈Javascript面向对象编程

    浅谈Javascript面向对象编程

    Javascript是一门很灵活的语言,允许我们模拟面向对象编程中的很多机机制
    2011-11-11

最新评论