ECMAscript开发的两种模式:
1.过程化 2.OOP(面向对象)
面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性的方法的对象。但是ECMAscript中没有类的概念!
又谈作用域
首先我们先创建一个对象:
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
不难看出,两段代码重复代码过多,所以我们就要用工厂模式避免实例化对象大量重复问题。
工厂模式
优点:集中实例化,可以传参等
缺点:分不清属于哪个对象
我们先来谈谈优点,看例子:
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
不难看出,工厂模式比上面的例子减少了很多代码。集中实例化了对象。用的时候直接调用就可以了,而且可以传参。不用在对象属性内部去修改参数。
缺点:
无法分清哪个是哪个的对象。
//我们来看看检测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中的工厂模式先讲到这里,下一章我们会讲到构造函数,来解决这个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。