淺談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中的工廠模式先講到這裏,下一章咱們會講到構造函數,來解決這個問題。

相關文章
相關標籤/搜索