• JavaScript之工厂方式 构造函数方式 原型方式讲解


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

    [javascript] view plaincopy
    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对象,并赋予属性和方法。执行代码后就可以使用对象,问题是我们经常需要重复、创建多个实例。

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

    [javascript] view plaincopy
    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对象。

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

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

    [javascript] view plaincopy
    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调用构造函数。

    [javascript] view plaincopy
    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属性,可以把它看成创建新对象所依赖的原型。

    [javascript] view plaincopy
    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属性。

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

    四、混合方式

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

    [javascript] view plaincopy
    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、使用原型方式解决了共享函数指向同一函数指针的问题。

  • 相关阅读:
    0045算法笔记——【随机化算法】舍伍德随机化思想搜索有序表
    精进~如何成为很厉害的人
    哪些小习惯一旦养成终生受用?
    2016第24周四
    2016第24周三
    2016第24周二
    2016第24周一
    2016第23周日
    前端资源汇总
    2016第23周五
  • 原文地址:https://www.cnblogs.com/milantgh/p/3651797.html
Copyright © 2020-2023  润新知