1. 程式人生 > >javascript面向物件——幾種常見的設計模式

javascript面向物件——幾種常見的設計模式

工廠模式: 這種模式比較簡單,其實就是在函式中建立一個物件,給物件新增屬性及其屬性值或屬性方法然後在講這個物件用return返回出來。 如下面的例項:
function myfile(name,work){
    var myself = new Object();  //建立一個新的物件
    myself.name = name;
    myself.work = work;
    myself.sayWork = function(){
        alert(this.work);
    };
    return myself;  //返回這個新建立的物件
}
var myFile1 = myfile("zhang","IT");
myFile1.sayWork();
在這個例子中,我們在建構函式myfile中建立了一個新的物件,併為這個物件添加了屬性及方法,在這個方法中this.work指向的則是呼叫它的物件,也就是myFile1,最後將新建立的這個物件用return返回出來,這樣就能實現在外部呼叫。 那麼如果我們不將新建立的物件返回出來會出現什麼樣的結果????如下圖:

是的,這樣會報錯,我們並不能呼叫sayWork這個方法顯示的是在原型物件中找不到sayWork這個方法。 建構函式模式: 建構函式模式相對於工廠模式要難以理解很多因為這種模式不僅建立了原型物件而且,它不像工廠模式建立的物件那麼單一,只能是Object,建構函式模式建立特定型別的物件,如:Array、或Date等。
function Myfile(name,work){
    this.name = name;
    this.work = work;
    this.sayWork = function(){
        alert(this.work);
    };
};
var myFile1 = new Myfile("zhang","IT");
myFile1.sayWork();		//IT
alert(Myfile.prototype.isPrototypeOf(myFile1));	//true
//我們用isPrototypeOf屬性來檢查myfile的原型物件與例項化物件myFile1之間的關係。
這個是典型的建構函式模式,在我們建立了建構函式的同時原型物件也會隨之創建出來,這個時候通過建構函式來建立的例項化物件也就會通過__proto__指向這個原型物件中。 總結:我們通過上面建構函式的例項簡單的總結它的一下幾個特點: 1、約定俗成,所有建構函式的函式名首字母需要大寫,(當然也可以小寫不會報錯但是不好看)。 2、在建構函式中我們不需像工廠模式那樣需要建立新的物件即 new Object(); 3、在建構函式中我們是直接將屬性以及方法賦值給了this物件,this指向的是呼叫它的那個物件。 4、當我們建立完成建構函式後需要new一個例項化的物件賦值給一個變數,然後可以通過這個變數來呼叫建構函式裡面的屬性以及方法。 原型模式:
function Myfile(){
    Myfile.prototype.name = "zhang";
    Myfile.prototype.work = "IT";
    Myfile.prototype.age = "100";
    Myfile.prototype.sex = "nan";
    Myfile.prototype.myself = function(){
        alert(this.name + this.work + this.age + this.sex);
    };
};
var myFile1 = new Myfile();
var myFile2 = new Myfile();
alert(myFile1.constructor == myFile2.constructor);
if((myFile1.name == myFile2.name) && (myFile1.work == myFile2.work) && (myFile1.age == myFile2.age) && (myFile1.sex == myFile2.sex)){
    alert("這兩個例項化物件所引用了同一個原型物件.");
}else{
    alert("好吧,看來是我理解出錯了!!!!");
}
我們看看彈出的結果是什麼?如下圖: 是的,正如圖所示,我們建立的所有的建構函式都會有一個prototype(原型)屬性,這個屬性其實就是一個指標,它指向了一個物件,在這個物件裡包含了可以共享給例項化物件的所有屬性及方法。但是問題,我相信你應該也已經看出來了,由於原型模式中沒有了建構函式模式中的this指向,在這裡所有的屬性都是固定寫死的,也就是說上面建立的兩個例項化的物件都是指向同一個原型物件中,而且原型物件的活動性很差,如果想修改其中一個例項化物件的屬性或方法另一個例項物件也會隨改變,這並非我們想要的結果,所以就會誕生了混合模式。 混合模式(建構函式模式 + 原型模式): 混合模式其實就是建構函式模式與原型模式的混合結果。 例項程式碼如下:
function myfile(name,work,friend){
this.name = name;
this.work = work;
this.friend = friend;
};
myfile.prototype.showMySelf = function(){
alert(this.name + this.work + this.friend);
};
var myself = new myfile("zhang","IT",["hu","li","he"]);
var myself2 = new myfile("hu","teacher",["he","yi","li"]);
myself.showMySelf();
myself2.showMySelf();
由上圖可以看出程式碼執行一切正常,那麼這個混合模式具體是怎麼實現的呢!?它的執行方式是怎樣的呢!? 其實很簡單,在混合模式中建構函式主要是用於定義例項的屬性,而原型模式我們都知道應用原型模式的時候會創建出原形物件,而這個物件正是用於儲存原型模式定義的方法和共享的一些屬性。 正如上面例項所示:例項化物件myself與myself2它們都共享著同一個方法,但是他們卻都有屬於自己的不同引數,從而傳入建構函式的屬性中去,在混合模式中每個例項化的物件既有共性,也有自己單獨的部分,互不影響。 動態原型: 我們先看看下面這段程式碼,看看有什麼不一樣的地方。
function myfile(name, work) {
    this.name = name;
    this.work = work;

    if (typeof this.myInfo != 'function') {
        // 這段程式碼只執行了一次
        alert("這是正確的");
        myfile.prototype.myInfo = function() {
            alert(this.name + this.work);
        }
    }
}

var myself = new myfile('zhang', 'IT'),myself2 = new myfile('hu', 'teacher');
myself2.myInfo();
我們看看都彈出了一些什麼,如下圖: 這是上面程式碼輸出的兩個alert結果,重點是為什麼我們這初始化了一個例項物件呢!myfile2並沒有被初始化,但是myfile2.myInfo();依然能夠正確顯示。其實原因很簡單,因為動態原型模式是將我們設定的所有資訊全部封裝在了建構函式中,然後通過建構函式來初始原型,其實我們只需要第一個物件例項化時初始化就行了,後面的例項化物件均可以不需要初始化。從上面程式碼彈出的結果我們就可以發現“這是正確的”其實也就只運行了一次,雖然我們做了兩次例項化。 綜上:我個人覺得還是混合模式(原型模式 + 建構函式模式)運用起來會比較好。 如有理解不當之處,歡迎各位老鐵留言指正。謝謝!!!!

相關推薦

javascript面向物件——常見設計模式

工廠模式: 這種模式比較簡單,其實就是在函式中建立一個物件,給物件新增屬性及其屬性值或屬性方法然後在講這個物件用return返回出來。 如下面的例項: function myfile(name,work){ var myself = new Object();

cocos2dx的常見設計模式

第二個問題是為什麼要這麼用,對於c++程式設計師來說初始化工作不都是在建構函式中完成的嗎,cocos中為何要這麼做呢?這裡引述一下王哲的話:“其實我們設計二段構造時首先考慮其優勢而非相容cocos2d-iphone. 初始化時會遇到圖片資源不存在等異常,而C++建構函式無返回值,只能用try-catch來處理

常見設計模式在專案中的應用<Singleton、Factory、Strategy>

一、前言   前幾天閱讀一框架文件,裡面有一段這樣的描述 “從物件工廠中………” ,促使寫下本文。儘管一些模式簡單和簡單,但是常用、有用。   結合最近一個專案場景回顧一下里面應用到的一些模式<Singleton、Factory、Strategy>。   示例程式碼:https://github.

常見設計模式

his 日誌 核心 rate 相同 產生 TP 價值 應該 設計模式 一書將設計模式引入軟件社區,該書的作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides Design(俗稱 “四人幫”)。所介紹的設計模式

python面向物件之抽象工廠設計模式

class truck: def use(self): return "拉貨" def __str__(self): return "大卡車"class minicar: def use(self): return "帶妹兜風" def __s

常見模式識別演算法整理和總結

這學期選了門模式識別的課。發現最常見的一種情況就是,書上寫的老師ppt上寫的都看不懂,然後繞了一大圈去自己查資料理解,回頭看看發現,Ah-ha,原來本質的原理那麼簡單,自己一開始只不過被那些看似formidable的細節嚇到了。所以在這裡把自己所學的一些點記錄下來,供備忘,也

測試用例的常見設計方法

  測試用例常見的設計方法有:等價類劃分法、邊界值分析法、錯誤推測法、判定表法、正交實驗法。  一.等價類劃分法  顧名思義,等價類劃分,就是將測試的範圍劃分成幾個互不相交的子集,他們的並集是全集,從每個子集選出若干個有代表性的值作為測試用例。  例如,我們要測試一個使用者名稱是否合法,使用者名稱的定義為:8

面向物件程式設計進階——設計模式 design patterns

前言 設計模式(design pattern)是一套被反覆使用、多數人知曉、經過分類編目的優秀程式碼設計經驗的總結。關鍵詞:重用程式碼、工程化、面向物件。設計模式起源於建築設計學,最先由 Gang of Four 提升到了理論高度。 可複用面向物件體系分為

java面向物件——多型、設計模式、程式碼塊

面向物件——多型 一、定義:一個物件可以有多種形態。 二、前提: 需要存在繼承或者實現關係(多型是物件的概念,和類沒有關係);要有覆蓋操作。 三、多型的特點:  把子類物件賦給父類變數,在執行時期

java常用設計模式簡單示例

1.單例設計模式        所謂單例設計模式簡單說就是無論程式如何執行,採用單例設計模式的類(Singleton類)永遠只會有一個例項化物件產生。具體實現步驟如下:       (1) 將採用單例設計模式的類的構造方法私有化(採用private修飾)。       (2

常見模式識別演算法整理 及 相關資料介紹和下載

這學期選了門模式識別的課。發現最常見的一種情況就是,書上寫的老師ppt上寫的都看不懂,然後繞了一大圈去自己查資料理解,回頭看看發現,Ah-ha,原來本質的原理那麼簡單,自己一開始只不過被那些看似formidable的細節嚇到了。所以在這裡把自己所學的一些點記錄下來,供備忘,也供參考。 1. K-Near

javascript 面向物件常見寫法(轉)

//定義Circle類,擁有成員變數r,常量PI和計算面積的成員函式area()  文章轉自:http://www.iteye.com/topic/434462 1.工廠方式 var Circle = function() { var obj = new Object

javascript 面向物件(實現繼承的方式)

 1、原型鏈繼承 核心: 將父類的例項作為子類的原型 缺點:  父類新增原型方法/原型屬性,子類都能訪問到,父類一變其它的都變了 function Person (name) { this.name =

Java常見設計模式

一、單例模式 基本概念:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 常見寫法: 懶漢式 public class Singleton { /* 持有私有靜態例項,防止被引用,此處賦值為null,目的是實現延遲載入 */ private static Singleton instance = nu

js面向物件常見寫法

//定義Circle類,擁有成員變數r,常量PI和計算面積的成員函式area()  1.工廠方式 var Circle = function() { var obj = new Object(); obj.PI = 3.14159; ob

面向物件五大設計原則以及常見設計模式總結

儘管本人已經從事OOP程式設計好幾年,但對於OOP程式設計的很多精髓依舊瞭解不深。加之最近專案不緊,特抽出時間總結一些面向物件設計原則以及設計模式的相關內容,加深自己的理解同時也希望可以幫到其他人。 note:程式設計是一門技術更是一門藝術,藝術來源於生活又高於生活。下面介紹的很多東西很多都

javascript面向物件系列第二篇——建立物件的5模式

前面的話   如何建立物件,或者說如何更優雅的建立物件,一直是一個津津樂道的話題。本文將從最簡單的建立物件的方式入手,逐步介紹5種建立物件的模式 物件字面量   一般地,我們建立一個物件會使用物件字面量的形式   [注意]有三種方式來建立物件,包括new建構函式、物件直接量和Object.crea

面向物件23設計模式

設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元

歸納下js面向物件常見寫法

//定義Circle類,擁有成員變數r,常量PI和計算面積的成員函式area()  1.工廠方式 var Circle = function() { var obj = new Object(); obj.PI = 3.14159; obj

你值得關注的常見的js設計模式

前言 潛水了一段時間,今天空閒時間覆盤下之前的知識點,聊聊 js 幾種常見的設計模式。 掌握 JavaScript 中常見的一些設計模式,對我們書寫規範性程式碼,可維護性程式碼有很大的幫助。 ps:最近在一些好友的鼓勵下,pubdreamcc 準備著手經營一個公眾號了,具體資訊會在接下來的兩天時間內釋出,新