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菜鸟一个,所以在许多理解的地方,不能证明到底理解对了还是错了,甚至是南辕北辙了,觉得还能看的,谢谢理解鼓励,觉得写的胡说八道的,请批评指教!