最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS常見構造模式實例對比分析

 更新時間:2018年08月27日 08:40:58   作者:liangklfang  
這篇文章主要介紹了JS常見構造模式,結合實例形式對比分析了工廠模式、構造函數(shù)模式、原型模式、寄生構造函數(shù)模式、穩(wěn)妥構造函數(shù)模式等相關概念、原理、實現(xiàn)方法與相關操作技巧,需要的朋友可以參考下

本文實例分析了JS常見構造模式。分享給大家供大家參考,具體如下:

1.工廠模式

沒有解決對象識別的問題。因為函數(shù)內部使用了new Object來創(chuàng)建對象

function Factory(name,age)
{
  var o=new Object();
  o.name=name;
  o.age=age;
  o.what=what;//用函數(shù)引用的方式消除重復創(chuàng)建相同函數(shù)的弊端,節(jié)省資源.函數(shù)引用可以修改this的指向,函數(shù)調用不可以!
  return o;
}
what=funciton()
{
  alert(this.name+this.age);
}
var o=Factory("12",12);
o.what();//what中的this指向o對象

這時候的constructor是Object,同時所有通過工廠模式返回的對象都是Object類型,所以instanceof操作符沒有意義

console.log(o.constructor);
//打印function Object() { [native code] }
console.log(o instanceof Object);
//而且這時候所有的對象都是Object類型的

2.構造函數(shù)模式

function Person(name,age)
{
this.name=name;
this.age=age;
this.sayName=function(){ alert(this.name);}//相當于this.sayName=new Function("alert(this.name)")
}
var p1=new Person("xx",12);
var p2=new Person("yy",13);
alert(p1.sayName==p2.sayName)//內存地址不一樣!返回false

構造函數(shù)相比工廠模式的優(yōu)點在于能夠正確的返回對象的類型,instanceof返回正確的結果。缺點在于如果向上面那樣,那么在每一個對象上面都要有一個sayName方法,而且這些sayName方法不是同一個Function實例,因為ECMAScript中函數(shù)是對象,因此每定義一個函數(shù),也就是實例化了一個對象!

對上面的方法進行優(yōu)化:

function Person(name,age)
{
this.name=name;
this.age=age;
this.sayName=sayName;//函數(shù)引用的方法,共享了同一個sayName,p1,p2的內存地址一樣,p1.sayName==p2.sayName返回true
}
function sayName()
{
alert(this.name);
}

缺點:全局函數(shù)sayName只能被某個對象調用p1.sayName,讓全局函數(shù)名不副實;如果對象要定義很多方法,那么就要定義很多的全局函數(shù),所以自定義的引用類型沒有封裝性可言

3.原型模式

(1)無法通過構造函數(shù)參數(shù)向原型屬性動態(tài)傳值,后果就是:沒有個性,改變原型屬性的值,所有的實例都會受到干擾!

(2)當原型屬性的是引用類型的時候,如果在一個對象實例上修改屬性,將會影響所有實例!

總之一句話:牽一發(fā)而動全身(包括屬性和引用類型的值)是原型模式的特點。但是相比于構造函數(shù)類型,原型類型滿足

person1.sayName===person2.sayName//兩者的引用是一樣的

4.構造函數(shù)原型模式

用構造函數(shù)定義個性,用原型模式定義共性

function Person(name,age)
{
 this.name=name;
 this.age=age;
 this.friends=['liangklfang','qinliang'];
}
//用原型定義共性
Person.prototype={
 constructor:Person,
 sayName:function()
 {
  console.log(this.name);
 }
}
var person1=new Person('liangklfang',"12");
var person2=new Person('liangklf',"14");
console.log(person1.sayName===person2.sayName);
//共性是函數(shù),打印true
console.log(person1.friends===person2.friends);
//friends是個性,打印false

也可以對構造函數(shù)原型模式進行優(yōu)化,就是常說的動態(tài)原型模式

function Book(title,page)
{
 this.title=title;
 this.page=page;
 if(typeof Book.isLock=="undefined")
//第一次的時候,Book.isLock是undefined,給原型綁定函數(shù),以后就不需要了,他相比于構造函數(shù)原型模式的優(yōu)點在于把所有的邏輯全部封裝到構造函數(shù)里面!
  {
   alert("Enter!");
Book.prototype.what=function() 
     {
   alert(this.title+this.pages);
     }
   Book.isLock=true;
 }
}
//下面的兩次調用alert("Enter!")只會調用因此i,因為第一次已經(jīng)通過Book.isLock設置為true了!相當于靜態(tài)方法!;
var b1=new Book("me",12);
b1.what();
var b2=new Book("he",13);
b2.what();

也可以在this中直接檢測,而不用給函數(shù)對象一個屬性

function Book(title,page)
{
 this.title=title;
 this.page=page;
  if(typeof this.sayName!='function')
  //第二次構造對象的時候會在原型中查找到sayName!
  {
   Book.prototype.sayName=function()
 {
  console.log(this.title);
 }
  }
}

5.寄生構造函數(shù)模式

除了使用new操作符以外,和工廠設計模式是一模一樣的!可以在特殊的情況下為對象創(chuàng)建構造函數(shù),例如想用構造函數(shù)方式創(chuàng)建一個具有額外方法的特殊數(shù)組,因為不能直接修改Array的構造函數(shù),因此可以用這個模式!

function SpecialArray()
{
  var value=new Array();
  value.push.apply(value,arguments);
  value.toPipedString=function()
  {
    return this.join("|");
}
 return value;
}

總之,寄生構造函數(shù)的特點就是:有點像java中的裝飾模式!把原來的對象進行裝飾,同時返回裝飾后的對象!這里就是把Array對象進行了裝飾!添加了toPipe的String方法。缺點就是不能依賴instanceof操作符確定對象類型了,因為和不再包裝類里面創(chuàng)建的對象是一模一樣的!

6. 穩(wěn)妥構造函數(shù)模式

特點:沒有公共屬性,而且其方法也不引用this的對象,instanceof失效。和寄生構造函數(shù)的不同在于不使用new來構造函數(shù),同時實例方法不引用this。實際是閉包

function Person(name,age,job)
{
   var o=new Object();
    o.sayName=funciton(){alert(name)}//這里實例方法沒有引用this,除了sayName不會有方法訪問傳入到構造函數(shù)中的原始數(shù)據(jù)!
   return o;
}
var friend=Person("xx",12,"teacher");
friend.name="female";//即使可以為這個對象修改了屬性name
friend.sayName();//不會被修改,依然彈出xx。不是female。但是,如果把上面的修改成:o.sayName=function(){alert(this.name)}//那么就會彈出female,也就是friend.name被修改成功了,如果沒有this,那么name的值一直引用的是原來的參數(shù)值!

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

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

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

相關文章

  • 使用原生js+canvas實現(xiàn)模擬心電圖的實例

    使用原生js+canvas實現(xiàn)模擬心電圖的實例

    下面小編就為大家?guī)硪黄褂迷鷍s+canvas實現(xiàn)模擬心電圖的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • safari,opera嵌入iframe頁面cookie讀取問題解決方法

    safari,opera嵌入iframe頁面cookie讀取問題解決方法

    最近做的合作網(wǎng)站嵌入到對方的iframe中去,在safari,opera和有些版本的搜狗瀏覽器(內核版本原因)中不能讀到cookie。
    2010-06-06
  • JavaScript?中如何攔截全局?Fetch?API?的請求和響應問題

    JavaScript?中如何攔截全局?Fetch?API?的請求和響應問題

    在本文中,我們介紹了什么是 JavaScript 攔截器,學習了如何通過給 Fetch API 使用猴子補丁和使用 fetch-intercept 庫來創(chuàng)建攔截器,對js攔截全局Fetch?API的請求和響應知識感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • 前端js?sm2實現(xiàn)加密簡單代碼舉例

    前端js?sm2實現(xiàn)加密簡單代碼舉例

    在Vue項目中實現(xiàn)數(shù)據(jù)加密,首先需要安裝SM2加密庫,如js-sm2或sm-crypto,通過npm或yarn進行安裝后,在Vue組件或文件中引入該庫,并使用其提供的加密、解密功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 輕松實現(xiàn)Bootstrap圖片輪播

    輕松實現(xiàn)Bootstrap圖片輪播

    這篇文章主要介紹了全面解析Bootstrap圖片輪播效果,Bootstrap提供了carousel插件,實現(xiàn)圖片輪播非常方便,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JavaScript數(shù)組分組groupBy示例詳解

    JavaScript數(shù)組分組groupBy示例詳解

    JavaScript?最近發(fā)布了一個方法?Object.groupBy,可以對可迭代對象中的元素進行分組,這篇文章主要介紹了JavaScript數(shù)組分組groupBy示例,需要的朋友可以參考下
    2023-12-12
  • 讓FireFox支持innerText的實現(xiàn)代碼

    讓FireFox支持innerText的實現(xiàn)代碼

    DHTML非標準屬性innerText在FireFox中的使用
    2009-12-12
  • JavaScript算法教程之sku(庫存量單位)詳解

    JavaScript算法教程之sku(庫存量單位)詳解

    這篇文章主要給大家介紹了JavaScript算法教程之sku(庫存量單位)的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • js觀察者模式的介紹及使用

    js觀察者模式的介紹及使用

    這篇文章主要介紹了java設計模式中觀察者模式,全文通過舉例子及代碼的形式進行了一個簡單的介紹,希望大家能夠理解并且學習到其中知識
    2021-08-08
  • JavaScript使用math.js進行精確計算操作示例

    JavaScript使用math.js進行精確計算操作示例

    這篇文章主要介紹了JavaScript使用math.js進行精確計算操作,結合實例形式分析了開源庫math.js進行高精度數(shù)學運算相關操作技巧,需要的朋友可以參考下
    2018-06-06

最新評論

怀柔区| 玛沁县| 崇文区| 延安市| 新巴尔虎左旗| 固始县| 仁怀市| 平潭县| 定南县| 双桥区| 新平| 青冈县| 房产| 平陆县| 黄冈市| 郑州市| 苏尼特右旗| 新沂市| 杭州市| 巴楚县| 黄陵县| 沾化县| 青铜峡市| 二连浩特市| 房产| 蕲春县| 霸州市| 临高县| 庐江县| 盘山县| 抚顺县| 自贡市| 漯河市| 绥棱县| 绵竹市| 上饶市| 象州县| 茌平县| 富平县| 琼中| 吉首市|