JS设计模式

一、工厂模式

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

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的实例

说明:一、在函数中定义对象,并定义对象的各类属性,虽然属性能够为方法,但建议将属性为方法的属性定义到函数以外,这样就能够避免重复建立该方法。this

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

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

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

二、构造函数

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

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

     二、p1和p2分别保存着Person的一个不一样实例blog

三、原型模式

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属性对属性进行定义。接口

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

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

五、单例模式

保证一个类仅有一个实例,用一个变量来标志当前是否已经为某个类建立过对象,若是是,则在下一次获取该类的实例时,直接返回以前建立的对象。事件

var Single = (function(){
    var instance;
    function init() {
        //define private methods and properties
        //do something
        return {
            //define public methods and properties
        };
    }

    return {
        // 获取实例
        getInstance:function(){
            if(!instance){
                instance = init();
            }
            return instance;
        }
    }
})();

var obj1 = Single.getInstance();
var obj2 = Single.getInstance();

console.log(obj1 === obj2);

六、观察者模式

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

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

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

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

应用场景:

(1)DOM事件

(2)自定义事件

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

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

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

相关文章
相关标签/搜索