欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript創(chuàng)建對象的四種常用模式實例分析

 更新時間:2019年01月11日 10:21:42   作者:jlu16  
這篇文章主要介紹了JavaScript創(chuàng)建對象的四種常用模式,結合實例形式分析了javascript使用工廠模式、構造函數模式、原型模式及動態(tài)原型模式創(chuàng)建對象的相關操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了JavaScript創(chuàng)建對象的四種常用模式。分享給大家供大家參考,具體如下:

這里介紹了javascript中創(chuàng)建對象常用的幾種模式,包括:工廠模式,構造函數模式,原型模式,組合構造函數與原型的模式,動態(tài)原型模式。

一.工廠模式

看如下代碼:

function getMySon(name,sex){
  var o={};
  o.name=name;
  o.sex=sex;
  o.sayName = function(){
    alert(this.name);
  }
  return o;
}
son1 = getMySon('li ming','male');
son2 = getMySon('li hong','female');

這就是工廠模式。在函數中定義一個對象,并為其添加屬性與方法,最后將這個對象返回。雖然這種模式實現了方便的創(chuàng)建對象,但是有這樣一個問題,即不能判斷這個實例到底是誰創(chuàng)建的。

比如 son1 intanceof getMySon并不能返回 true。因為這里的實例確切來說并不是由getMySon 通過new來創(chuàng)建的,而是getMySon中的 o。
所以工廠模式并不適合需要創(chuàng)建很多種對象的情況。

那么怎么創(chuàng)建對象才能正確的判斷實例是從哪兒來的呢?下面就要說到構造函數模式了。

二.構造函數模式

看如下代碼 :

function getMySon(name,sex){
  this.name = name;
  this.sex = sex;
  this.sayName = function(){
    alert(this.name);
  }
}
son1 = new getMySon('li ming','female');

這就是構造函數模式,注意在調用時要用 new。

在進行new調用時,進行如下幾個步驟:

1. 創(chuàng)建一個新的對象(并把空對象的__proto__屬性設置為getMySon.prototype)。

2. 將構造函數的作用域賦給新對象(此時this 指向了這個新對象)。

3. 執(zhí)行構造函數中的代碼(通過this 為這個新對象添加屬性)

4. 返回新對象。

通過這種方式產生的實例可以使用son1 instanceof getMySon來判斷實例是由誰來產生的。

那么使用構造函數有什么問題呢?由于每次使用new時都會創(chuàng)建一個新的對象,那么所有的數據在不同實例之間是不共享的。但是對于函數sayName來說,它并沒有必要創(chuàng)建多個。這樣做浪費了空間。

這樣就引出了下一種,原型模式。

三. 原型模式

看如下代碼:

function getMySon(){}
getMySon.prototype.name = 'li ming';
getMySon.prototype.sex = 'female';
getMySon.prototype.sayName = function(){
  alert(this.name);
}

這就是原型模式(原型的相關知識這里不詳細說)。

原型模式將屬性和方法添加到了getMySon.prototype里,prototype由所有的實例共享,它只有一份,并不是所有的實例各有一份。

這種方式實現了讓函數只有一份,不必占用多余的空間。但是,name,sex之類的屬性并不需要在所有實例間共享,而且使用原型模式進行傳參生成這些屬性也不方便。

那么可以合并構造函數模式與原型模式,利用它們各自的優(yōu)點。讓各實例間不需要進行共享且需要通過傳參進行生成的屬性放在構造函數模式中生成,讓各實例中需要共享的(比如方法)在原型模式中生成。

三. 組合構造函數與原型的模式

看如下代碼:

function getMySon(name,sex){
  this.name=name;
  this.sex=sex;
}
getMySon.prototype.sayName(){
  alert(this.name);
}
son1=new getMySon('li ming','female');

這是 組合構造函數與原型的模式 。這種方式結合了構造函數模式與原型模式的優(yōu)點。這是最常用的一種創(chuàng)建對象的模式。

四. 動態(tài)原型模式

所謂動態(tài)原型模式,其實是對 組合構造函數與原型的模式 的一種封裝。
看如下代碼:

function getMySon(name,sex){
  this.name = name;
  this.sex = sex;
  //即使有多個需要定義的方法,也只需判斷一個方法。
  if(typeof sayName != 'function'){
    getMySon.prototype.sayName=function(){
      alert(this.name);
    }
  }
}
son1=new getMySon('li ming','female');

這里之所以命名為動態(tài)原型模式,是因為getMySon在不同的調用中會發(fā)生變化,是動態(tài)的。只有在第一次調用getMySon時才會執(zhí)行對sayName函數的定義。
從本質來看,仍然是將不需共享的通過構造函數進行定義,需要共享的方法通過原型進行定義。只是將它們放在了一起,進行了封裝。

感興趣的朋友還可以使用本站在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行結果。

更多關于JavaScript相關內容還可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • JavaScript通過字典進行字符串翻譯轉換的方法

    JavaScript通過字典進行字符串翻譯轉換的方法

    這篇文章主要介紹了JavaScript通過字典進行字符串翻譯轉換的方法,涉及javascript字符串轉換的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 超實用的JavaScript表單代碼段

    超實用的JavaScript表單代碼段

    這篇文章主要為大家分享了超實用的JavaScript表單代碼段,幫助大家更好地學習使用javascript表單操作,感興趣的小伙伴們可以參考一下
    2016-02-02
  • js獲取鍵盤按鍵響應事件(兼容各瀏覽器)

    js獲取鍵盤按鍵響應事件(兼容各瀏覽器)

    js獲取鍵盤按鍵響應事件(兼容各瀏覽器),需要的朋友可以參考一下
    2013-05-05
  • 詳解JS ES6編碼規(guī)范

    詳解JS ES6編碼規(guī)范

    本章節(jié)討論使用ES6編碼風格到代碼中需要注意的點。通過記住這些關鍵點,可以讓我們寫出更優(yōu)美的、可讀性更強的JavaScript ES6風格的代碼。
    2021-05-05
  • 一篇文章看懂JavaScript中的回調

    一篇文章看懂JavaScript中的回調

    這篇文章主要給大家介紹了如何通過一篇文章看懂JavaScript中的回調,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • JS跨域交互(jQuery+php)之jsonp使用心得

    JS跨域交互(jQuery+php)之jsonp使用心得

    JSON是一種基于文本的數據交換方式,或者叫做數據描述格式,這篇文章主要介紹了JS跨域交互(jQuery+php)之jsonp使用心得的相關資料,非常不錯,具有參考借鑒價值,需要的朋友一起學習吧
    2016-07-07
  • js實現增加數字顯示的環(huán)形進度條效果

    js實現增加數字顯示的環(huán)形進度條效果

    本文主要分享了js實現增加數字顯示的環(huán)形進度條效果的示例代碼。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JS 調試中常見的報錯問題解決方法

    JS 調試中常見的報錯問題解決方法

    下面小編就為大家?guī)硪黄狫S 調試中常見的報錯問題解決方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • js判斷一個字符串是以某個字符串開頭的簡單實例

    js判斷一個字符串是以某個字符串開頭的簡單實例

    下面小編就為大家?guī)硪黄猨s判斷一個字符串是以某個字符串開頭的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • JavaScript編寫實現飛機大戰(zhàn)

    JavaScript編寫實現飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了JavaScript編寫實現飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論