zoukankan      html  css  js  c++  java
  • 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、使用原型方式解决了共享函数指向同一函数指针的问题。

  • 相关阅读:
    kitten编程猫 学习教程(一) 学习笔记
    华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案
    华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?
    为啥你写的代码总是这么复杂?
    云图说|不要小看不起眼的日志,“小日志,大作用”
    如何高效地存储与检索大规模的图谱数据?
    华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)
    开发者必看,面试官心中的最佳数据库人才模型是什么样?
    华为云PB级数据库GaussDB(for Redis)揭秘第九期:与HBase的对比
    技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?
  • 原文地址:https://www.cnblogs.com/milantgh/p/3651797.html
Copyright © 2011-2022 走看看