工厂模式相似于现实生活中的工厂能够生产大量类似的商品,去作一样的事情,实现一样的效果。 用函数来封装以特定接口建立对象的细节函数
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)自定义事件
优势:时间上解耦,对象之间解耦
缺点:建立订阅者自己要消耗必定的时间和内存,当订阅一个消息后,也许该消息永远也没有发生,可是这个订阅者会始终存在于内存中。
虽然弱化了对象之间的联系,可是过分使用的话,对象与对象之间的必要联系也被深埋在背后,致使程序难以跟踪维护和理解。