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