Python 前端開發(fā)之Javascript 面向?qū)ο?/a>

      網(wǎng)友投稿 682 2025-04-01

      javascript面向?qū)ο?/p>

      一、面向?qū)ο螅私猓?/p>

      創(chuàng)建對象的幾種常用方式:

      1.使用Object或?qū)ο笞置媪縿?chuàng)建對象

      2.工廠模式創(chuàng)建對象

      3.構(gòu)造函數(shù)模式創(chuàng)建對象

      4.原型模式創(chuàng)建對象

      Python 前端開發(fā)之Javascript 面向?qū)ο? title=

      JS中最基本創(chuàng)建對象的方式:

      var?student?=?new?Object(); student.name?=?"easy"; student.age?=?"20";

      這樣,一個student對象就創(chuàng)建完畢,擁有2個屬性name以及age,分別賦值為"easy"和20。

      如果你嫌這種方法有一種封裝性不良的感覺。來一個對象字面量方式創(chuàng)建對象。

      var?sutdent?=?{ ??name?:?"easy", ??age?:?20 };

      這樣看起來似乎就完美了。但是馬上我們就會發(fā)現(xiàn)一個十分尖銳的問題:當我們要創(chuàng)建同類的student1,student2,…,studentn時,我們不得不將以上的代碼重復n次....

      創(chuàng)建多個變量的困擾:

      var?sutdent1?=?{ ??name?:?"easy1", ??age?:?20 }; var?sutdent2?=?{ ??name?:?"easy2", ??age?:?20 }; ... var?sutdentn?=?{ ??name?:?"easyn", ??age?:?20 };

      有個問題?能不能像工廠車間那樣,有一個車床就不斷生產(chǎn)出對象呢?我們看”工廠模式”。

      JS中沒有類的概念,那么我們不妨就使用一種函數(shù)將以上對象創(chuàng)建過程封裝起來以便于重復調(diào)用,同時可以給出特定接口來初始化對象

      function?createStudent(name,?age)?{ ??var?obj?=?new?Object(); ??obj.name?=?name; ??obj.age?=?age; ??return?obj; } var?student1?=?createStudent("easy1",?20); var?student2?=?createStudent("easy2",?20); ... var?studentn?=?createStudent("easyn",?20);

      這樣一來我們就可以通過createStudent函數(shù)源源不斷地”生產(chǎn)”對象了。看起來已經(jīng)高枕無憂了,但貪婪的人類總有不滿足于現(xiàn)狀的天性:我們不僅希望”產(chǎn)品”的生產(chǎn)可以像工廠車間一般源源不斷,我們還想知道生產(chǎn)的產(chǎn)品究竟是哪一種類型的。

      比如說,我們同時又定義了”生產(chǎn)”水果對象的createFruit()函數(shù):

      水果對象:

      function?createFruit(name,?color)?{ ??var?obj?=?new?Object(); ??obj.name?=?name; ??obj.color?=?color; ??return?obj; } var?v1?=?createStudent("easy1",?20); var?v2?=?createFruit("apple",?"green");

      對于以上代碼創(chuàng)建的對象v1、v2,我們用instanceof操作符去檢測,他們統(tǒng)統(tǒng)都是Object類型。我們的當然不滿足于此,我們希望v1是Student類型的,而v2是Fruit類型的。為了實現(xiàn)這個目標,我們可以用自定義構(gòu)造函數(shù)的方法來創(chuàng)建對象

      在上面創(chuàng)建Object這樣的原生對象的時候,我們就使用過其構(gòu)造函數(shù):

      var?obj?=?new?Object();

      構(gòu)造函數(shù)創(chuàng)建原生數(shù)組:

      var?arr?=?new?Array(10);??//構(gòu)造一個初始長度為10的數(shù)組對象

      在進行自定義構(gòu)造函數(shù)創(chuàng)建對象之前,我們首先了解一下構(gòu)造函數(shù)和普通函數(shù)有什么區(qū)別。

      1、實際上并不存在創(chuàng)建構(gòu)造函數(shù)的特殊語法,其與普通函數(shù)唯一的區(qū)別在于調(diào)用方法。對于任意函數(shù),使用new操作符調(diào)用,那么它就是構(gòu)造函數(shù);不使用new操作符調(diào)用,那么它就是普通函數(shù)。

      2、按照慣例,我們約定構(gòu)造函數(shù)名以大寫字母開頭,普通函數(shù)以小寫字母開頭,這樣有利于顯性區(qū)分二者。例如上面的new Array(),new Object()。

      3、使用new操作符調(diào)用構(gòu)造函數(shù)時,會經(jīng)歷(1)創(chuàng)建一個新對象;(2)將構(gòu)造函數(shù)作用域賦給新對象(使this指向該新對象);(3)執(zhí)行構(gòu)造函數(shù)代碼;(4)返回新對象;4個階段。

      ok,了解了構(gòu)造函數(shù)和普通函數(shù)的區(qū)別之后,我們使用構(gòu)造函數(shù)將工廠模式的函數(shù)重寫,并添加一個方法屬性:

      function?Student(name,?age)?{ ??this.name?=?name; ??this.age?=?age; ??this.alertName?=?function(){ ????alert(this.name) ??}; } function?Fruit(name,?color)?{ ??this.name?=?name; ??this.color?=?color; ??this.alertName?=?function(){ ????alert(this.name) ??}; }

      這樣我們再分別創(chuàng)建Student和Fruit的對象:

      var?v1?=?new?Student("easy",?20); var?v2?=?new?Fruit("apple",?"green");

      instanceof操作符來檢測對象類型:

      alert(v1?instanceof?Student);??//true alert(v2?instanceof?Student);??//false alert(v1?instanceof?Fruit);??//false alert(v2?instanceof?Fruit);??//true alert(v1?instanceof?Object);??//true?任何對象均繼承自O(shè)bject alert(v2?instanceof?Object);??//true?任何對象均繼承自O(shè)bject

      這樣我們就解決了工廠模式無法區(qū)分對象類型的尷尬。那么使用構(gòu)造方法來創(chuàng)建對象是否已經(jīng)完美了呢?使用構(gòu)造器函數(shù)通常在js中我們來創(chuàng)建對象。

      我們會發(fā)現(xiàn)Student和Fruit對象中共有同樣的方法,當我們進行調(diào)用的時候這無疑是內(nèi)存的消耗。

      我們完全可以在執(zhí)行該函數(shù)的時候再這樣做,辦法是將對象方法移到構(gòu)造函數(shù)外部:

      function?Student(name,?age)?{ ??this.name?=?name; ??this.age?=?age; ??this.alertName?=?alertName; } function?alertName()?{ ??alert(this.name); } var?stu1?=?new?Student("easy1",?20); var?stu2?=?new?Student("easy2",?20);

      在調(diào)用stu1.alertName()時,this對象才被綁定到stu1上。

      我們通過將alertName()函數(shù)定義為全局函數(shù),這樣對象中的alertName屬性則被設(shè)置為指向該全局函數(shù)的指針。由此stu1和stu2共享了該全局函數(shù),解決了內(nèi)存浪費的問題

      但是,通過全局函數(shù)的方式解決對象內(nèi)部共享的問題,終究不像一個好的解決方法。如果這樣定義的全局函數(shù)多了,我們想要將自定義對象封裝的初衷便幾乎無法實現(xiàn)了。更好的方案是通過原型對象模式來解決。

      原型鏈甚至原型繼承,是整個JS中最難的一部分也是最不好理解的一部分,在這里由于我們課程定位的原因,如果對js有興趣的同學,可以去查閱一下相關(guān)JS原型的一些知識點。更加有助于你以后前端JS的面試。

      示例:

      function?Student()?{ ????this.name?=?'easy'; ????this.age?=?20; } Student.prototype.alertName?=?function(){ ????alert(this.name); }; var?stu1?=?new?Student(); var?stu2?=?new?Student(); stu1.alertName();??//easy stu2.alertName();??//easy alert(stu1.alertName?==?stu2.alertName);??//true?二者共享同一函數(shù)

      軟件開發(fā) 人工智能 云計算 機器學習

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel實現(xiàn)按顏色求和與計數(shù)函數(shù)
      下一篇:Excel表格中如何制作平面直角坐標系(如何用excel制作直角坐標系)
      相關(guān)文章
      精品亚洲成α人无码成α在线观看 | 亚洲伊人成无码综合网 | 中文字幕精品亚洲无线码一区 | 亚洲熟女乱综合一区二区| 国产成人亚洲精品91专区高清| 亚洲色欲啪啪久久WWW综合网| 欧洲 亚洲 国产图片综合| 亚洲欧洲日韩极速播放| 亚洲色图激情文学| 亚洲熟女精品中文字幕| 亚洲精品无码成人片久久不卡| 亚洲一区二区观看播放| 亚洲精品无码久久久久APP | 337p日本欧洲亚洲大胆艺术| 91精品国产亚洲爽啪在线影院| 亚洲激情在线观看| 亚洲日本在线观看网址| 亚洲最大成人网色香蕉| 伊人久久亚洲综合影院首页| 亚洲色无码专区一区| 亚洲1区2区3区精华液| 亚洲精品第一国产综合精品99| AV在线亚洲男人的天堂| 日韩一卡2卡3卡4卡新区亚洲 | 在线精品亚洲一区二区| 亚洲爆乳无码专区www| 国产精品亚洲а∨无码播放不卡 | 久久精品国产精品亚洲人人 | 亚洲aⅴ天堂av天堂无码麻豆| 婷婷亚洲天堂影院| 国产亚洲精品无码专区| 国产av无码专区亚洲av桃花庵 | 国产精品亚洲а∨天堂2021 | 亚洲国产成人精品无码区在线观看 | 国产亚洲精品激情都市| 人人狠狠综合久久亚洲88| 亚洲欧洲日韩不卡| 精品亚洲AV无码一区二区三区| 亚洲午夜福利在线视频| 含羞草国产亚洲精品岁国产精品| 亚洲美女高清一区二区三区|