本篇介紹OOP的第二個對象factory。在以往項目中其實真正使用klass的地方至關少,而factory則是十分常見的。設計模式
在smartjs中的factory並非指的是工廠模式。在factory要求定義一個基礎對象,這個對象能夠是基類,也能夠是模板對象或者是接口。而後factory就已此基礎對象爲基礎,其餘添加或者建立的對象,繼承或者是複製基礎對象的屬性和方法。factory在提供一系列方法來對這些對象作控制。數組
factory通過簡單的處理能夠實現工廠、外觀、模板等設計模式。ui
//多參數接口 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.build(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模式this
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");
mergespa
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核心的重要模塊:基於策略的數據管理code