javascript中的模式解析——工厂模式

  昨天晚上看了《javascript高级程序设计》第六章——面向对象的程序设计,《javascript高级程序设计》一书可以说是javascript中的圣经,每个有志于javascript的程序猿都应该多次阅读,请原谅我刚读第一遍就鲁莽的向大家述说我的理解,如果有什么不对的地方,欢迎批评,最好能指点一下!

  好了,下面进去正题,OO(面向对象)语言都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象,但是javascript中没有类的概念,所以说到javascript的模式,在我的理解下,就是找到一种能创建一种即能让所有实例共享相同属性和方法,又能让每个实例各自有各自的属性或方法的方式(童言无忌,理解不到位请原谅),但这种方式不是只有一种(这就是多种模式的原因吧)。

  如果你已经过了菜鸟阶段,请跳过这一段,作为一个准备去找工作的大学僧,你一定不敢相信我昨天才知道了call()方法(还有apply()方法)

 

    function add(a,b)  
    {  
        alert(a+b);  
    }  
    function sub(a,b)  
    {  
        alert(a-b);  
    }  
      
    add.call(sub,3,1);   //你猜它是几---结果是4

 

为什么是4呢,请看call方法的定义

call方法:
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

怎么说呢,形象一点的说,A.call(B);就是A把自己的东西给了B或者是B把A的东西拿过来用了(童言无忌,理解不到位请原谅)。add.call(sub,3,1);怎么理解呢,sub对象把add对象的alert方法拿到手了,拿到手就要用啊,所以add.call(sub,3,1);等于4

apply方法大致相同,但是apply方法的第二位属性只能是数组

对了,你猜如果 A.call(B);C.call(B);B会不会同时具有A和C的东西,答案是会的——多重继承。

终于来到了模式

工厂模式

 

function createPerson(name,age,job){
 var o= new object();
  o.name=name;
  o.age=age;
  o.job=job    
  o.sayName=function(){
    alert(this.name);      
    }
}
var person1 = new createPerson("guoshiwe" , 23 , "web");
var person2 = new createPerson("Nicholas" , 29 ,"Software Engineer");
工厂模式

 我个人感觉工厂模式挺眼熟,毕竟我也是一个半吊子C#程序猿(我大学是.net专业,虽然没有好好学习CS)。工厂模式可以解决任意创建多个具有相同属性和方法的对象,但是工厂模式不能解决对象识别问题(即怎样知道一个对象的类型)

又到了童言无忌时刻,怎么理解不能解决对象识别问题  我理解为当你敲了很多行代码,创建了好多对象的时候,你不太容易知道当初到底是用哪个function创建的这个对象,是createPerson方法还是createAnimal方法,所以你要给你创建的对象定义一下,这个对象是个什么类型。所以,有了工厂模式后面的构造函数模式

总结:首先表示抱歉,javascript菜鸟一个,所以在许多理解的地方,不能证明到底理解对了还是错了,甚至是南辕北辙了,觉得还能看的,谢谢理解鼓励,觉得写的胡说八道的,请批评指教!

 

posted @ 2015-10-20 21:53  dogsmall  阅读(646)  评论(0编辑  收藏  举报