美文网首页
前端设计模式

前端设计模式

作者: ahong_吴 | 来源:发表于2017-03-13 11:12 被阅读16次

    一、写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。

    //模块模式
            var Person =(function(){
                var name = 'ahong';
                function sayName(){
                    console.log(name);
                }
    
                return {
                    name:name,
                    sayName:sayName
                }
            })()
    
            Person.sayName();
    
    //构造函数模式
            function Person(){
                this.name = name;
                this.age = age;
            }
            Person.prototype.sayName = function(){
                return this.name;
            }
            var student = new Person("ahong",23);
    
    //构造器方式与原型方式的混合模式
          var Person = function(name, age) {
        this.name = name;
        this.age = age;
    };
    Person.prototype.sayName = function(){
      console.log(this.name);
    }
    var Student = function(name, age,  score) {
        Person.call(this, name, age);
        this.score = score;
    };
    //Student.prototype = Object.create(Person.prototype);
    Student.prototype = create(Person.prototype);
    function create (parentObj){
        function F(){}
        F.prototype = parentObj;
        return new F();
    };
    Student.prototype.sayScore = function(){
      console.log(this.score);
    }
    var student = new Student("饥人谷", 28, 99);
    console.log(student);
    
    //工厂模式
        在函数内创建一个对象,给对象赋予属性及方法再将对象返回。
            function createCar(name,age){
                var oTemp = new Object();
                oTemp.name = name;
                oTemp.age = age;
                oTemp.sayName = function(){
                    console.log(this.name);
                }
                return oTemp;    // return出来一个对象 创建不同的引用
            }
            var c1 = createCar("tom","80");
            c1.sayName();
    
    //单例模式
            var People = (function(){
                var instance;   // 用闭包来保存一个引用 不用重复创建
                function init(){
                    console.log('1');
                }
                return {
                    createPeople:function(){
                        if(!instance){   // 执行一次后引用就存在了 之后就不会再执行了
                            instance = init();
                        }
                        return instance;
                    }
                }
            })()
            var obj1 = People.createPeople();
            var obj2 = People.createPeople();
            obj1 === obj2;  // 单例模式节约内存 把原来存储的类型return出来
    
    //发布订阅模式
            var EventCenter = (function(){
    
                var events = {}; // 储存所有的key与value
    
                function on(evt,handler){
                    events[evt] = events[evt] || [];
                    events[evt].push({
                        handler:handler
                    })
                }
    
                function fire(evt,args){
                    if(!events[evt]){ //没有订阅就不执行
                       return;
                    }
                    for(var i=0; i<events[evt].length; i++){
                        events[evt][i].handler(args);
                    }
                }
                
                return{
                    on:on,   // 订阅
                    fire:fire   // 触发
                }
            })()   // 处理异步场景
    

    二、使用发布订阅模式写一个事件管理器,可以实现如下方式调用

    Event.on('change', function(val){
       console.log('change...  now val is ' + val);  
    });
    Event.fire('change', '饥人谷');
    Event.off('changer');
    
    var EventManager = (function () {
            var event = {};
    
            function on(evt,handler){
                event[evt] = event[evt] || [];
                event[evt].push({
                    handler: handler
                })
            }
    
            function fire(evt,args) {
                if(!event[evt]){
                    return
                }
                for(var i = 0; i<event[evt].length;i++){
                    event[evt][i].handler(args);
                }
            }
    
            function off(evt) {
                if(!event[evt]){
                    return
                }else{
                    event[evt] = [];
                }
            }
    
            return {
                on: on,
                fire: fire,
                off: off
            }
        })()
    
        EventManager.on('text:change', function(val){//添加数组
            console.log('text:change...  now val is ' + val);
        });
        EventManager.fire('text:change', '饥人谷');//运行
        EventManager.off('text:change');//删除
    

    相关文章

      网友评论

          本文标题:前端设计模式

          本文链接:https://www.haomeiwen.com/subject/kqnvgttx.html