浅谈OOP Javascript [1]

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

相关文章
相关标签/搜索