一、工厂方式可以为一个对象,创建多个实例。

  1. var oCar = new Object;
  2. oCar.color = "red";
  3. oCar.doors=4;
  4. oCar.mpg=23;
  5. oCar.showColor = function(){
  6. alert(this.color);
  7. }

上面的代码,创建car对象,并赋予属性和方法。执行代码后就可以使用对象,问题是我们经常需要重复、创建多个实例。

解决此问题的方法是:创建能够返回特定类型的对象的工厂函数。

  1. function createCar(){
  2. var oTempCar = new Object;
  3. oTempCar.color = "red";
  4. oTempCar.doors= 4;
  5. oTempCar.mpg  = 23;
  6. oTempCar.showColor= function(){
  7. alert(this.doors);
  8. }
  9. return oTempCar;
  10. }
  11. var oCar1 = createCar();
  12. var oCar2 = createCar();

执行代码,将创建2个car对象。

上面的代码仍存在问题:为每个对象创建独立的函数版本,但实际上他们的函数功能是一样的,无需独立创建。

解决方法:创建外部函数重写工厂函数。

  1. function showColor(){
  2. alert(this.color);
  3. }
  4. function createCar(){
  5. var oTempCar = new Object;
  6. oTempCar.color = "red";
  7. oTempCar.doors = 4;
  8. oTempCar.mpg = 23;
  9. oTempCar.showColor = showColor;
  10. return oTempCar;
  11. }

二、构造函数方式

在构造函数内部无需创建对象,而是使用this关键字。使用new调用构造函数。

  1. function Car(sColor, iDoors, iMpg){
  2. this.color = sColor;
  3. this.doors= iDoors;
  4. this.mpg  = iMpg;
  5. this.showColor = function(){
  6. alert(this.color);
  7. };
  8. }
  9. var oCar1 = new Car("red", 4, 23);
  10. car oCar2 = new Car("blue",3, 25);

与工厂方式相同,构造函数也存在无法共享方法的问题。解决方法仍然是使用外部函数。

三、原型方式

该方式利用了对象的prototype属性,可以把它看成创建新对象所依赖的原型。

  1. function Car(){}  //创建空构造函数类名
  2. Car.prototype.color = "red";
  3. Car.prototype.doors= 4;
  4. Car.prototype.mpg = 23;
  5. Car.prototype.showColor = function(){
  6. alert(this.color);
  7. }
  8. var oCar1 = new Car();
  9. var oCar2 = new Car();

所有的属性和方法都被直接赋予创建对象所依赖的原型prototype属性。

原型方式很好的解决了构造函数方式、工厂方式的无法共享方法问题,但却出现一个新问题:无法传递参数,初始化属性。

四、混合方式

看到三者的优缺点,唯有混合使用它们。

  1. function Car(sColor, iDoor, iMpg){
  2. this.color = sColor;
  3. this.doors=iDoors;
  4. this.mpg = iMpg;
  5. this.drivers = new Array("Mike","Sue");
  6. }
  7. Car.prototype.showColor = function(){
  8. alert(this.color);
  9. }
  10. var oCar1 = new Car("red", 4, 23);
  11. var oCar2 = new Car("blue", 3, 25);
  12. oCar1.drivers.push("Matt");
  13. alert(oCar1.drivers); //输出 "Mike,Sue,Matt"
  14. alert(oCar2.drivers);//输出  "Mike,Sue"

1、使用构造函数方式,解决了传递参数的问题。

2、使用原型方式解决了共享函数指向同一函数指针的问题。

JavaScript之工厂方式 构造函数方式 原型方式讲解的更多相关文章

  1. javascript继承之借用构造函数与原型

    javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...

  2. Javascript面向对象——创建对象、构造函数的原型

    Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...

  3. JavaScript对象的创建之动态原型方式

    为了让定义的方式更加符合java的需求,就把定义方法的原型代码放置在Person这个构造函数中. function Person(name,age,friends){ //属性在构造函数中定义 thi ...

  4. JavaScript对象的创建之基于原型方式

    原型内存模型介绍 原型是javascript中非常特殊的一个对象,当一个函数创建之后,会随之就产生一个原型对象. 当通过这个函数的构造函数创建一个具体的对象之后,在这个具体的对象中就会有一个属性指向原 ...

  5. JavaScript中定义对象的四种方式

    最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...

  6. 声明对象的方式/构造函数/原型/this指向

      函数的发展历程(声明函数的方式):     1.通过Object构造函数或字面量的方式创建单个对象 var obj = new Object; obj.name="新华"; o ...

  7. JavaScript提高篇之面向对象之单利模式工厂模型构造函数原型链模式

    1.单例模式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

  9. Javascript中函数的四种调用方式

    一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...

随机推荐

  1. ContentProvider与ContentResolver使用【转】

    这篇文章被转载而转载者未注明原文出处,在此未加上原文地址链接,本人向原作者致以歉意. 下面是文章内容: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写 ...

  2. C#之委托初步

    传说中的东西,今天兴趣来了,就研究了研究,把大概什么是委托,如何使用委托稍微梳理了一下. 1.什么是委托 首先,Class(类)是对事物的抽象,例如,哺乳动物都是胎生,那么你可以定义一个哺乳动物的基类 ...

  3. 第六章 管理类型(In .net4.5) 之 创建类型

    1. 概述 本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型. 2. 主要内容 2.1 如何选择类型 C#类型系统包括三种类型:值类型.引用类型.指针类型.(指针类型用于非托管代码,很少使 ...

  4. 《Prism 5.0源码走读》 设计模式

    Prism或Prism构建的应用程序时会使用大量的设计模式,本文简要列举Prism相关的那些设计模式. Adapter(适配器模式):Prism Library主要在Region和IoC contai ...

  5. Microsoft Visual Studio 语言切换

    事情的起因是需要安装本地的中文帮助,OS以及Viusal Studio都安装的英语版本. 其实需要安装的安装Viusal Studio的中文语言包即可. 通过工具选项可以达到以下的对话框 可以通过下载 ...

  6. 小心C语言的定义与声明

    小心C语言的定义与声明 转自360博客 注:为便于说明问题,文中提及的变量和函数都被简化. 一.起源 DBProxy在测试过程中,发现对其执行某步管理操作后,程序有时会崩溃,但不是每次都出现. 二.G ...

  7. CodeForces 569A 第八次比赛 C题

    Description Little Lesha loves listening to music via his smartphone. But the smartphone doesn't hav ...

  8. Redis到底该如何利用?【转自:http://www.cnblogs.com/capqueen/p/HowToUseRedis.html】

    Redis是个好东西,经过上两个星期的研究和实践,目前正在项目里大规模的替换掉原来的本地内存cache.但是替换过程中却发现,Redis这东西高端,大气上档次,似乎不是我想象里的使用方法. 在没有深入 ...

  9. Karaf 基于 osgi

    Karaf是Apache旗下的一个开源项目.Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件,应用程序.Karaf提供了很多特性用于帮助开发 ...

  10. 官方的objective - c风格指南。

    The official raywenderlich.com Objective-C style guide. This style guide outlines the coding convent ...