ECMAscript开发的两种模式:
1.过程化 2.OOP(面向对象)程序员
面向对象的语言有一个标志,那就是类的概念,而经过类能够建立任意多个具备相同属性的方法的对象。可是ECMAscript中没有类的概念!函数
又谈做用域this
首先咱们先建立一个对象:code
var createObject = new Object(); //建立一个Object对象 createObject.a = 'abc'; //给对象添加属性 createObject.b = 10; //同上 createObject.c = function () { //给对象添加方法 return this.a + this.b; //这里的this做用域是createObject下 }; alert(createObject.c()); //返回abc10
不难看出,在实例化createObject下的方法里面,this的做用域是指向自己的!
咱们理解了做用域接下来咱们继续看,若是我想建立两个一样的方法和属性,就要写不少重复代码,这是程序员最烦的问题。好比咱们还要建立一个createObject1:对象
var createObject1 = new Object(); //建立一个Object对象 createObject1.a = 'abcdef'; //给对象添加属性 createObject1.b = 20; //同上 createObject1.c = function () { //给对象添加方法 return this.a + this.b; //这里的this做用域是createObject下 }; alert(createObject1.c()); //返回abcdef20
不难看出,两段代码重复代码过多,因此咱们就要用工厂模式避免实例化对象大量重复问题。ip
工厂模式作用域
优势:集中实例化,能够传参等
缺点:分不清属于哪一个对象开发
咱们先来谈谈优势,看例子:io
function createObject(a,b){ var obj = new Object(); //集中实例化 obj.a = a; obj.b = b; obj.c = function () { return this.a + this.b; }; return obj; //返回实例化对象 } var box = createObject('abc',10); var box1 = createObject('abcdef',20); alert(box.c()); //返回abc10 alert(box1.c()); //返回abcdef20
不难看出,工厂模式比上面的例子减小了不少代码。集中实例化了对象。用的时候直接调用就能够了,并且能够传参。不用在对象属性内部去修改参数。function
缺点:
没法分清哪一个是哪一个的对象。
//咱们来看看检测box,box1的类型 alert(typeof box); //object alert(typeof box1); //object
WTF?哪一个是哪一个的对象?根本傻傻分不清!不少人说了,那就用instanceof去检测是否是object实例不就得了?
(instanceof 是用来判断一个变量是不是某个对象的实例)
alert(box instanceof Object); //true alert(box1 instanceof Object); //true
事实证实,仍是分不清到底box,box1是谁的实例。
OOP Javascript中的工厂模式先讲到这里,下一章咱们会讲到构造函数,来解决这个问题。