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

首頁 > 編程 > JavaScript > 正文

JavaScrpt的面向對象全面解析

2019-11-19 16:37:59
字體:
來源:轉載
供稿:網友

每次說到javascript的面向對象,總感覺自己心里懂,但是卻不知道該怎么說,這就是似懂非懂到表現,于是乎,每次一說,就要到處去查找資料,零零碎碎到看了一些,感覺有懂了,但是過段時間,好像又不知道是怎么回事了,于是乎,又到處找資料,然道是我本來就缺對象?才不理解對象是啥,以至于現實中找找對象,javascript中也在找對象!哎,好尷尬?。≈钡轿铱吹搅艘粋€妹紙寫到“不可不知的javascript面向對象”,我才明白面向對象是什么,這是不是說我要找到對象就是這個妹紙呢😄,先記錄一下備忘吧,下面是妹紙寫到主要內容:

對象的創建:

1 創建一個面向對象

var obj = new Object(); obj.name = 'haha';obj.showName = function(){  alert(obj.name);}obj.showName();

缺點:當我們想創建多個面向對象的時候,重復代碼過多,需要封裝,所以有了工廠方法。

2 工廠方式

function CreatePerson(name){  var obj = new Object(); //原料 obj.name = name;   //加工 obj.showName = function(){  alert(this.name); }  return obj;//出廠}var p1 = CreatePerson('haha');p1.showName();var p2 = CreatePerson('hehe');p2.showName();//其實就是簡單的封裝函數,整個過程像工廠的流水線,所以叫工廠方式

缺點:無法識別創建的對象的類型。因為全部都是Object,沒有區分度,不像Date、Array等,因此出現了構造函數模式。

3 構造函數模式

function CreatePerson(name){  this.name = name;  this.showName = function(){   alert(this.name); } } var p1 =new CreatePerson('haha'); p1.showName();var p2 = new CreatePerson('hehe'); p2.showName(); 

我們通過這二個方面來改變:

1 函數名首字母大寫

這是為了區別于普通的函數,構造函數本身其實就是普通的函數,只是我們專門用它來實現了構造的功能,所以專門起了一個名字叫構造函數,任何函數都可以成為構造函數,這取決于你調用函數的方式,當使用了New的方式調用就成了構造函數。

2 New 關鍵字調用

調用函數的時候用了 New關鍵字,那么New到底做了什么?用不用New有什么區別?再來看下面的例子

function CreatePerson(name){ this.name = name; this.showName = function(){  alert(this.name);  };  console.log(this);} new CreatePerson('haha'); //CreatePersonCreatePerson('haha'); //window

我們會發現當用New去調用一個函數的時候,this的指向會不一樣。其實New主要做了下面這些事,不過下面寫的只是大概的行為,并不是內部源碼。

function CreatePerson(name){  var obj = {}; //聲明一個空對象obj  obj._proto_= CreatePerson.prototype; //把這個對象的_proto_屬性指向構造函數的原型對象,這樣obj就可以調用CreatePerson原型對象下的所有方法 ,這里原型先知道結論,下面會講。 CreatePerson.apply(obj); //用apply方法讓this指向obj對象 this.name = name; //obj對象添加屬性,方法 this.showName = function(){   alert(this.name);  };  return obj;//返回這個對象}

函數構造模式存在的問題:

alert(p1.showName==p2.showName);//false

缺點:可見這兩個對象并不是共用一個方法,每new一次,系統都會新創建一個內存,這兩個對象各自有各自的地盤,但他們具有相同的功能,還不共用,肯定不是我們所希望的。所以就有了下一種方法,原型+構造模式

4 原型+構造模式

原型:每個函數都有一個prototype屬性,它是一個對象,也稱作原型對象,我們可以把方法和屬性寫在它上面(不過原型對象不僅僅有我們寫的屬性和方法,還有別的,下面會介紹),而通過這個函數創建出來的實例對象,都能共享這個原型對象下的方法和屬性。所以我們只需要把想要共享的東西放在函數的prototype下,不想共享的東西通過構造函數來創建就可以了。
看個栗子(原型+構造)

function CreatePerson(name){  this.name = name;}CreatePerson.prototype.showName = function(){  alert(this.name);}var p1 =new CreatePerson('haha');p1.showName();var p2 = new CreatePerson('hehe');p2.showName();alert(p1.showName==p2.showName);//true

測試為true,可見showName()方法是共享的,也就是說他們共用一個內存,更進一步的說它們存在引用關系,也就是說你更改了p1的showName也會影響p2的showName。

_proto_屬性:

同一個函數造出來的實例對象能共享這個函數的prototype下的方法和屬性,但是它是如何做到的呢?這里要出場的就是_proto_屬性.

每個實例化對象都有_proto_屬性,它是一個指針,指向函數的prototype,也就是保存了它的地址。(JS中任何對象的值都是保存在堆內存中,我們聲明的變量只是一個指針,保存了這個對象的實際地址,所以有了地址就能找到對象),
所以總得來說,每個實例化對象都有_proto_屬性,保存了構造函數的原型對象的地址,通過這個屬性就可以擁有原型對象下的所有屬性和方法,_proto_屬性實際就是實例化對象和原型對象之間的連接

原型鏈:

每個函數都可以成為構造函數,每個函數都有原型對象,每個原型對象也可以是一個實例化對象,比如,你創建了一個函數fun,它是構造函數function的實例化對象,而function的原型對象,又是Object的實例對象。所以fun有個_proto_屬性可以訪問到function的原型對象,function原型對象也是個實例對象,也有個_proto_屬性,可以訪問到Object的原型對象,所以通過_proto_屬性,就形成了一條原型鏈。每個實例化對象都可以訪問到鏈子上方的方法和屬性,所以fun是可以訪問Object原型對象下的方法和屬性的。實際上所有對象都可以訪問到Object的原型對象。

原型鏈的訪問規則:先在自身的下面尋找,再去一級一級的往原型鏈上找。

如下:

function Aaa(){}Aaa.prototype.num = 3;var a1 = new Aaa();a1.num =10;alert(a1.num); //10

原型對象:

原型對象下可能有三種屬性:

1 原型對象所帶方法和屬性 2 constructor 3_proto_屬性

constructor:構造函數屬性,每個函數的原型對象都有的默認屬性,指向函數。

每個實例化對象本身是沒有constructor屬性的,他們下面默認只有一個_proto_屬性,用來連接原型對象,而和構造函數本身是沒有直接的聯系的。所以它的constructor是訪問的原型對象上的。所以當原型對象的constructor變化了,實例化對象的constructor也會改變。但是如果這個對象本身既是原型對象,又是實例化對象,那就擁有了constructor屬性,無需從原型對象上面訪問。**

看下面的例子,來驗證我們所說的:

function CreatePerson(name){  this.name = name;}CreatePerson.prototype.showName = function(){  console.log(this.name); };var p1 =new CreatePerson('haha');p1.showName();console.log(p1.constructor); // CreatePerson 來自CreatePerson.prototypeconsole.log(CreatePerson.prototype); // {showName:{},constructor:CreatePerson,__proto__:Object.prototype}//可見,原型對象保存了  1 自身添加的方法,  2 構造函數constructor   3 _proto_(和上一層構造函數原型對象的連接)console.log(CreatePerson.prototype.__proto__===Object.prototype);// true 這個原型對象本身又是object的實例化對象,所有_proto_指向Object的原型對象console.log(CreatePerson.prototype.__proto__===Object);// false 可見是和構造函數下原型對象的連接,不是構造函數console.log(CreatePerson.prototype.constructor);//CreatePerson CreatePerson.prototype是Object實例化對象,也是原型對象,所以自身擁有constructor屬性console.log(Object.prototype.__proto__); // null 原型鏈的終點是nullconsole.log(CreatePerson.__proto__); //function.prototype// CreatePerson本身既是構造函數又是function的實例化對象,擁有_proto_屬性,指向function的原型對象console.log(CreatePerson.constructor); // function 繼承自function.prototypeconsole.log(CreatePerson.prototype instanceof CreatePerson ) //驗證是否在一條原型鏈上 false

字面量法定義原型:

為了創建對象的代碼更方便,你一定見過這樣的代碼,就是字面量法:

function Aaa(){}Aaa.prototype = {  showName:function(){}, showSex:function(){}}; var a1 = new Aaa();console.log(Aaa.prototype);//{showName:function(){},_proto_} //你會發現constructor不見了,因為這種方式相當于重新賦值了Aaa.prototype console.log(Aaa.prototype.constructor);//Object 因為自身沒有了constructor屬性,就去上級原型對象找,找到了Objectconsole.log(a1.constructor );//Object 也變了,驗證了它是訪問的原型對象上的

因此我們在寫的時候需要修正一下原型的指向:

function Aaa(){}Aaa.prototype = { constructor:Aaa, num1:function(){alert(10);}}var a1 = new Aaa();a1.constructor // Aaa

 以上所述是小編給大家介紹的JavaScrpt的面向對象全面解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美裸体xxxx极品少妇| 国产一区二区三区四区福利| 精品亚洲一区二区| 欧洲日韩成人av| 欧美成人精品一区二区| 91精品91久久久久久| 日韩免费视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 欧美在线激情视频| 日韩精品欧美国产精品忘忧草| 国产精品久久久久久久久久久久| 日本久久久久亚洲中字幕| 欧美日韩免费一区| 国内揄拍国内精品少妇国语| 亚洲国产欧美精品| 狠狠操狠狠色综合网| 日韩高清av一区二区三区| 亚洲精品自拍第一页| 欧美人在线观看| 国产中文欧美精品| 91av视频在线播放| 国产亚洲免费的视频看| 精品久久久久久亚洲精品| 日韩网站免费观看高清| 这里只有精品在线播放| 日韩高清中文字幕| 国产成人福利夜色影视| 国产精品第100页| 色综合久久精品亚洲国产| 国产色婷婷国产综合在线理论片a| 日本久久久久久久| 久久国产精品电影| 国产精品久久久久久超碰| 91av免费观看91av精品在线| 奇米四色中文综合久久| 狠狠色狠色综合曰曰| 亚洲日韩中文字幕在线播放| 成人深夜直播免费观看| 亚洲人在线视频| 国产精品国产三级国产aⅴ9色| 成人久久一区二区| 国产精品视频在线观看| 在线免费观看羞羞视频一区二区| 国产精品网红福利| 欧美高清激情视频| 久久91精品国产91久久久| 国产精品美女网站| 久久精品国产一区| 欧美一区二粉嫩精品国产一线天| 精品国产一区二区三区久久久| 欧美在线不卡区| 久久人人爽人人爽人人片亚洲| y97精品国产97久久久久久| 精品亚洲永久免费精品| 久久精品久久久久久国产 免费| 亚洲级视频在线观看免费1级| 国产精品亚洲美女av网站| 日韩va亚洲va欧洲va国产| 亚洲性视频网址| 亚洲欧美国产精品久久久久久久| 欧美制服第一页| 欧美成人精品一区二区| 国产97在线|亚洲| 国产精品欧美风情| 91精品国产综合久久久久久久久| 国产精品一二三在线| 欧美视频在线观看 亚洲欧| 欧美区在线播放| 精品视频久久久久久久| 国产精品福利在线观看网址| www.欧美视频| 国产精品国产三级国产aⅴ浪潮| 视频一区视频二区国产精品| 尤物yw午夜国产精品视频明星| 久久久久久久一区二区| 欧美日韩美女视频| 69久久夜色精品国产7777| 欧美激情小视频| 久久成人这里只有精品| 国产精品入口尤物| 亚洲国产精品资源| 日韩经典中文字幕| 欧美激情免费观看| 欧美成人在线影院| 欧美日韩亚洲网| 亚洲精品日韩丝袜精品| 亚洲自拍欧美另类| 欧美色道久久88综合亚洲精品| 久久福利网址导航| 欧美激情区在线播放| 高清一区二区三区日本久| 国产精品久久久久久久美男| 亚洲男人天堂九九视频| 亚洲精品天天看| 国产精品最新在线观看| 精品一区二区三区四区| 亚洲第一区第二区| 国产日韩视频在线观看| 欧美日韩中文字幕在线视频| 国产精品99导航| 18一19gay欧美视频网站| 91免费人成网站在线观看18| 国模精品系列视频| 亚洲欧美中文日韩在线v日本| 欧美电影在线观看完整版| 日韩高清不卡av| 欧美激情第99页| 疯狂做受xxxx欧美肥白少妇| 精品一区二区亚洲| 亚洲国产精品人人爽夜夜爽| 国产午夜精品美女视频明星a级| 国产美女精彩久久| 亚洲欧美日韩久久久久久| 日韩成人av在线播放| 国产免费一区二区三区在线观看| 欧美性高潮在线| 久久精品影视伊人网| 国产精品久久久久久影视| 欧美一级片免费在线| 欧美日本高清视频| 狠狠色狠色综合曰曰| 久久久久久久久亚洲| 亚洲在线免费观看| 91精品视频大全| 热门国产精品亚洲第一区在线| 久久精品国产清自在天天线| 色www亚洲国产张柏芝| 海角国产乱辈乱精品视频| 国产精品扒开腿做爽爽爽视频| 久久久成人精品视频| 日韩精品电影网| 欧美激情精品久久久久久蜜臀| 国产免费一区视频观看免费| 成人黄色片网站| 97久久伊人激情网| 欧美性猛交xxxx乱大交极品| 亚洲性无码av在线| 欧美精品在线视频观看| 欧美一区三区三区高中清蜜桃| 日韩激情第一页| 国产97在线观看| 日韩av在线一区二区| 日韩美女中文字幕| 欧美精品做受xxx性少妇| 久久综合网hezyo| 日韩av不卡在线| 欧美在线免费看| 欧美性xxxxxx| 成人在线中文字幕| 亚洲自拍高清视频网站| 成人黄色在线播放| 欧美高跟鞋交xxxxxhd| 欧美人在线观看| 久久精品国产亚洲精品2020| 亚洲色图15p| 欧美理论在线观看| 日韩中文av在线| 欧美视频精品一区| 夜夜嗨av色一区二区不卡| 国产成人精品在线视频| 欧美成人精品一区| 精品久久中文字幕| 国产成人aa精品一区在线播放| 久久久久久有精品国产|