標籤:style class blog code color get
本篇介紹OOP的第二個對象factory。在以往項目中其實真正使用klass的地方相當少,而factory則是十分常見的。
在smartjs中的factory並不是指的是原廠模式。在factory要求定義一個基礎對象,這個對象可以是基類,也可以是模板對象或者是介面。然後factory就已此基礎對象為基礎,其他添加或者建立的對象,繼承或者是複製基礎對象的屬性和方法。factory在提供一系列方法來對這些對象做控制。
factory經過簡單的處理可以實現工廠、外觀、模板等設計模式。
介面說明
//多參數介面 st.factory(name, base, proto, type, initDefault) //參數對象介面 st.factory({ //工廠名 name : "", //基類對象 base : {}, //工廠的擴充屬性和方法對象 proto:{}, //工廠的類型;預設:類執行個體化後的對象;class:類對象,未執行個體化;merge:對象複製合并 type : "", //是否將base設定成為預設的對象;當使用factory.get找不到對象時返回預設對象 initDefault:true }) //建立工廠後的介面說明 //建立產品方法,但不註冊到factory中去,name:產品名稱;item:產品特性;parent:父類名稱 factory.create(name, item, parent) //添加產品方法,會註冊到factory中去,name:產品名稱;item:產品特性;parent:父類名稱 factory.add(name, item, parent) //尋找產品方法,name:產品名稱;defaultMode:是否在找不到產品的時候返回預設對象 factory.find(name, defaultMode) //刪除產品方法,name:產品名稱 factory.remove(name) //設定預設產品方法,name:產品名稱 factory.setDefault(name) //執行所有產品的某個方法,fnName:產品的方法名稱;args:參數數組 factory.fire(fnName,args)
執行個體代碼
//widget基類 var baseWidget = { //widget類型 type: ‘‘, //widget的渲染方法 render: function(id) { return this.type + ‘:‘ + id; } }; //一個widget工廠 var widgetFactory = st.factory(‘wdigetfactory‘, baseWidget); //添加一個input widgetFactory.add(‘input‘, { type: ‘input‘ }) it("factory add", function() { //找到添加的input var input = widgetFactory.find(‘input‘); expect(input).toBeDefined(); //輸出 expect(input.render(‘txt‘)).toBe("input:txt"); }); it("factory inheirt", function() { //添加一個number類型的input var num = widgetFactory.add(‘number‘, { type: ‘input[number]‘ }, ‘input‘) expect(num.render(‘txtNum‘)).toBe("input[number]:txtNum"); });
class模式
var f1 = st.factory({ name: ‘classMode‘, //設定class類型 type: ‘class‘, base: { klassInit: function(name) { this.name = name; } } }); var c1 = f1.add(‘c1‘, { type: ‘c1‘ }); expect(c1.fn).toBeDefined(); //需要初始化 var c = new c1(‘class1‘); expect(c.type).toBe("c1"); expect(c.name).toBe("class1");
merge
var f2 = st.factory({ name: ‘copyMode‘, //設定merge類型 type: ‘merge‘, //設定預設模式 initDefault: true, base: { name: ‘copy‘, project: { name: ‘smartjs‘ } } }) var c = f2.add(‘c1‘, { name: ‘c1‘, project: { role: ‘pm‘ } }); expect(f2.find().name).toBe("copy"); expect(c.name).toBe("c1"); expect(c.project.name).toBe("smartjs"); expect(c.project.role).toBe("pm");
factory的使用方式還有很多,暫時就不多做介紹了,有機會專門找個專題來介紹具體的使用案列。另外在smartjs後續的內容中,也會大量使用factory。
smartjs 下一版預告,會加入smartjs核心的重要模組:基於策略的資料管理