zoukankan      html  css  js  c++  java
  • JS设计模式

    1、工厂模式

    工厂模式类似于现实生活中的工厂可以生产大量相似的商品,去做同样的事情,实现同样的效果。 用函数来封装以特定接口创建对象的细节

    function Person(name,age){
        var obj=new Object();
        obj.name=name;
        obj.age=age;
        obj.sayName=function(){
            return this.name;
        }
        return obj;
    }
    var p1=Person('cdsvf','33');
    console.log(p1.sayName());//cdsvf
    console.log(p1.constructor);//Object 不知道是哪个对象的实例 应该是Person的实例

    说明:1、在函数中定义对象,并定义对象的各种属性,虽然属性可以为方法,但建议将属性为方法的属性定义到函数之外,这样就可以避免重复创建该方法。

       2、在函数的最后返回该对象

    工厂模式是为了解决多个类似对象声明的问题,即解决实例化对象时产生重复的问题。

    缺点:不知道是哪个对象的实例

    2、构造函数

    function Person(name,age){
        this.name=name;
        this.age=age;
        this.sayName=function(){
            return this.name;
            }
    }
    var p1=new Person('cdsvf','33');
    var p2=new Person('asw','12');
    console.log(p1.sayName());//cdsvf
    console.log(p1.constructor);//Person
    console.log(p2.constructor);//Person

    说明:1、与工厂模式相比,使用构造函数创建对象时无需在函数内部创建对象,而是使用this指代,且函数无需return

         2、p1和p2分别保存着Person的一个不同实例

    3、原型模式

    var sayName=function(){
        return 'name';
    }
    function Person(){
        Person.prototype.name='cdsvf';
        Person.prototype.age='33';
        Person.prototype.sayName=sayName;
    }
    var p1=new Person();
    console.log(p1.name);//cdsvf

    说明:函数中不对属性进行定义,利用prototype属性对属性进行定义。

    4、构造函数+原型模式(推荐)

    function Person(){
        this.name='cdsvf';
        this.age='33';
    }
    Person.prototype.sayName=function(){
        return this.name;
    }
    var p1=new Person();
    console.log(p1.name);//cdsvf

    5、单例模式

    保证一个类仅有一个实例,实现方法为:先判断实例是否存在,如果存在则直接返回,如果不存在就创建再返回,这就确保了一个类只有一个实例。

    class CreateUser{
        constructor(name){
            this.name=name;
            this.getName();
        }
        getName(){
            return this.name;
        }
    }
    var ProxyMode=(function(){
        var instance=null;
        return function(name){
            if(!instance){
                instance=new CreateUser(name);
            }
            return instance;
        }
    })();
    
    var a=new ProxyMode('aaa');
    var b=new ProxyMode('bbb');
    console.log(a===b);//true

    适用场景:一个单一对象,比如:弹窗,无论点击多少次,弹窗之应该被创建一次。

    6、观察者模式

    定义对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知。由主体和观察者组成,主体负责发布事件,观察者通过订阅这些事件来观察主体。

    例如事件绑定,就是一个标准的观察者模式

    document.body.addEventListener('click',function(){
        console.log('3');
    })
    document.body.click();

    对于发布者代码如自定义事件,handlers用于存放订阅者以及订阅者订阅的事件

    应用场景:

    (1)DOM事件

    (2)自定义事件

    优点:时间上解耦,对象之间解耦

    缺点:创建订阅者本身要消耗一定的时间和内存,当订阅一个消息后,也许该消息永远也没有发生,但是这个订阅者会始终存在于内存中。

       虽然弱化了对象之间的联系,但是过度使用的话,对象与对象之间的必要联系也被深埋在背后,导致程序难以跟踪维护和理解。

    7、策略模式

    定义一些列的算法,把他们一个个封装起来。

    var levelObj={
        "A":function(money){
            return money*4;
        },
        "B":function(money){
            return money*3;
        },
        "C":function(money){
            return money*2;
        }
    }
    var p=function(level,money){
        return levelObj[level](money);
    }
    console.log(p("A",100));
  • 相关阅读:
    十一作业
    11.20
    11.13 第十二次、
    11.13 第十一次、
    11.06第十次、
    11.06第九次、
    10.30
    10.23
    10.16
    10.9
  • 原文地址:https://www.cnblogs.com/xiaoan0705/p/10594527.html
Copyright © 2011-2022 走看看