zoukankan      html  css  js  c++  java
  • smartjs 0.2 OOP讲解

    本篇介绍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.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模式

    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核心的重要模块:基于策略的数据管理

  • 相关阅读:
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
  • 原文地址:https://www.cnblogs.com/zhh8077/p/3790040.html
Copyright © 2011-2022 走看看