惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
MongoDB | Blog
MongoDB | Blog
The Register - Security
The Register - Security
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
Cisco Talos Blog
Cisco Talos Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
W
WeLiveSecurity
S
Securelist
I
Intezer
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Latest news
Latest news
aimingoo的专栏
aimingoo的专栏
C
Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
K
Kaspersky official blog
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
AWS News Blog
AWS News Blog
T
Tenable Blog
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
L
LINUX DO - 最新话题
小众软件
小众软件
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Forbes - Security
Forbes - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
U
Unit 42
O
OpenAI News
V
V2EX
T
Troy Hunt's Blog

博客园 - Roy Zhang

让文档和Demo生成更加简单和强大 - SmartDoc 0.1.1 说明 SmartDoc(YUIDoc) 注释编写 JS文档和Demo自动化生成工具 - SmartDoc发布 smartjs - DataManager 场景示例分析 - 数据懒加载 smartjs - DataManager API smartjs 0.3 DataManager 发布&介绍 SmartJS 系列规划分享和背景介绍 smartjs 0.2 OOP讲解 - Klass 类继承 smartjs 0.2发布 - 新增oop模块&AOP增强 smartJS 0.1 API 讲解 - FlowController smartJS 0.1 API 讲解 - Trigger smartJS 0.1 API 讲解 - PromiseEvent SmartJS 第一期(0.1)发布 - AOP三剑客 SmartUI2.0后续声明 JQuery SmartUI 2.0 方案启动 JQuery Smart UI 开发规范&API文档发布 JQuery Smart UI与Moss结合演示 JQuery Smart UI 快捷开发实例应用(二)— 开发模式【从项目开发流程说起】 告别aspx,高性能快捷开发 — JQuery Smart UI 快捷开发实例应用(一)入门【后篇】
smartjs 0.2 OOP讲解 - factory
Roy Zhang · 2014-06-15 · via 博客园 - Roy Zhang

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