1

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中的工厂模式先讲到这里,下一章我们会讲到构造函数,来解决这个问题。


Brian_Lee
397 声望40 粉丝

人生为棋,我愿为卒,行动虽慢,可谁见我曾后退一步!