亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:45:52
字體:
來源:轉載
供稿:網友

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

1.工廠模式

沒有解決對象識別的問題。因為函數內部使用了new Object來創建對象

function Factory(name,age){  var o=new Object();  o.name=name;  o.age=age;  o.what=what;//用函數引用的方式消除重復創建相同函數的弊端,節省資源.函數引用可以修改this的指向,函數調用不可以!  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.構造函數模式

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

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

對上面的方法進行優化:

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

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

3.原型模式

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

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

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

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

4.構造函數原型模式

用構造函數定義個性,用原型模式定義共性

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);//共性是函數,打印trueconsole.log(person1.friends===person2.friends);//friends是個性,打印false

也可以對構造函數原型模式進行優化,就是常說的動態原型模式

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

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

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.寄生構造函數模式

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

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

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

6. 穩妥構造函數模式

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

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

 

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利视频导航一区| 国产成人综合亚洲| 中文字幕精品www乱入免费视频| 国产精品99久久久久久久久久久久| 精品呦交小u女在线| 亚洲国产日韩欧美在线图片| 国产一区二区三区在线免费观看| 国产国语刺激对白av不卡| 亚洲女人天堂色在线7777| 中文字幕亚洲欧美一区二区三区| 亚洲色图偷窥自拍| 亚洲精品网址在线观看| 美日韩丰满少妇在线观看| 国产精品久久久久久久久久久久久久| 国产精品美女www爽爽爽视频| 国产精品一区二区三区毛片淫片| 久久九九全国免费精品观看| 91香蕉嫩草神马影院在线观看| 国产精品美女999| www.久久久久久.com| 久青草国产97香蕉在线视频| 欧美激情a∨在线视频播放| 国产日韩欧美在线观看| 色婷婷综合久久久久中文字幕1| 国产成人精品一区二区在线| 成人xxxx视频| 欧美性色19p| 久久精品国产欧美亚洲人人爽| 高清欧美电影在线| 成人有码在线视频| 日韩在线播放视频| 日本欧美爱爱爱| 久久九九全国免费精品观看| 欧美另类69精品久久久久9999| 日韩美女写真福利在线观看| 久久人人爽人人爽爽久久| 久久伊人免费视频| 亚洲精品日产aⅴ| 国产欧美最新羞羞视频在线观看| 精品久久久久久久久久| 亚洲高清在线观看| 91久久精品国产91久久性色| 97色在线观看免费视频| 久久久久久91| 欧美激情一区二区三区久久久| 国自在线精品视频| 福利视频导航一区| 8x海外华人永久免费日韩内陆视频| 亚洲国产精品久久久久秋霞蜜臀| 91爱视频在线| 成人免费观看网址| 欧美人成在线视频| 日韩久久免费电影| 亚洲色图av在线| 91精品国产乱码久久久久久久久| 成人午夜黄色影院| 日韩在线观看网址| 91精品视频一区| 不卡av电影在线观看| 日韩欧美精品在线观看| 久久99精品久久久久久噜噜| 亚洲精品福利资源站| 国产精品午夜国产小视频| 久久中文字幕在线视频| 国产精品69久久久久| 国产成人亚洲综合91| 亚洲一区美女视频在线观看免费| 精品久久久久久久久久国产| 91九色视频导航| 国产精品香蕉国产| 97欧美精品一区二区三区| 中文字幕日韩av综合精品| 精品二区三区线观看| 91免费看视频.| 国产精品久久91| 日韩av免费看网站| 国内精品一区二区三区| 美日韩精品免费观看视频| 欧美丰满少妇xxxx| 亚洲免费一级电影| 亚洲欧美制服综合另类| 日韩欧美国产中文字幕| 久久久国产成人精品| 伊人青青综合网站| 欧亚精品在线观看| 日韩精品中文字幕在线播放| 欧美成人精品一区二区三区| 国产欧美精品一区二区三区介绍| 午夜精品国产精品大乳美女| 欧美丰满少妇xxxxx做受| 亚洲日韩欧美视频一区| 国产精品日日摸夜夜添夜夜av| 亚洲香蕉av在线一区二区三区| 精品中文字幕久久久久久| 久久久国产精品视频| 亚洲欧洲午夜一线一品| 国产精品日韩av| 久久久久久久999| 欧美一级在线亚洲天堂| 国模精品一区二区三区色天香| 免费av一区二区| 日韩亚洲精品视频| 成人激情黄色网| 久久久电影免费观看完整版| 亚洲综合中文字幕在线观看| 国产97在线播放| 欧美成人sm免费视频| 国产成人在线一区二区| 欧美在线视频一区二区| 亚洲无限av看| 亚洲女性裸体视频| 国内精品中文字幕| 91精品久久久久久久久久另类| 性欧美长视频免费观看不卡| 欧美大学生性色视频| 国内精品国产三级国产在线专| 国产成人小视频在线观看| 91在线观看免费网站| 岛国av午夜精品| 亚洲free性xxxx护士白浆| 欧美日韩国产一区二区三区| 亚洲综合av影视| 亚洲视频电影图片偷拍一区| 欧美激情二区三区| 国产亚洲欧洲黄色| 欧美性猛交xxxx乱大交极品| 色多多国产成人永久免费网站| 日本91av在线播放| 91在线高清视频| 日韩电影第一页| 久久久成人精品| 久久国产加勒比精品无码| 97色在线视频观看| 国产一区二区三区在线免费观看| 北条麻妃在线一区二区| 成人性生交大片免费观看嘿嘿视频| 久久综合久久八八| 欧美激情在线观看视频| 91精品视频免费看| 免费不卡欧美自拍视频| 日韩精品视频在线| 欧美日韩精品在线观看| 欧美一级黄色网| 91免费视频网站| 久久久久久久av| 国产日韩欧美日韩| 国产精品丝袜久久久久久不卡| 91国自产精品中文字幕亚洲| 啪一啪鲁一鲁2019在线视频| 国产精品视频白浆免费视频| 欧美视频免费在线观看| 日韩不卡中文字幕| 国产成+人+综合+亚洲欧洲| 91欧美精品午夜性色福利在线| 亚洲综合在线中文字幕| 性色av香蕉一区二区| 亚洲国产欧美一区二区丝袜黑人| 国产ts人妖一区二区三区| 黑人巨大精品欧美一区二区免费| 欧美大荫蒂xxx| 日韩欧美在线字幕| 久久躁狠狠躁夜夜爽| 尤物九九久久国产精品的分类| 日本精品视频网站|