工廠模式相似於現實生活中的工廠能夠生產大量類似的商品,去作一樣的事情,實現一樣的效果。 用函數來封裝以特定接口建立對象的細節函數
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)自定義事件
優勢:時間上解耦,對象之間解耦
缺點:建立訂閱者自己要消耗必定的時間和內存,當訂閱一個消息後,也許該消息永遠也沒有發生,可是這個訂閱者會始終存在於內存中。
雖然弱化了對象之間的聯繫,可是過分使用的話,對象與對象之間的必要聯繫也被深埋在背後,致使程序難以跟蹤維護和理解。