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

首頁 > 開發 > JS > 正文

JavaScript中工廠函數與構造函數示例詳解

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

前言

當談到JavaScript語言與其他編程語言相比時,你可能會聽到一些令人困惑東西,其中之一是工廠函數和構造函數。

工廠函數

所謂工廠函數,就是指這些內建函數都是類對象,當你調用他們時,實際上是創建了一個類實例”。意思就是當我調用這個函數,實際上是先利用類創建了一個對象,然后返回這個對象。由于 Javascript 本身不是嚴格的面向對象的語言(不包含類),實際上來說,Javascript 并沒有嚴格的“工廠函數”,但是在 Javascript中,我們能利用函數模擬類。來看下面一個例子:

function person(firstName, lastName, age) { const person = {}; person.firstName = firstName; person.lastName = lastName; person.age = age; return person;}

上述代碼,創建一個新對象,并將傳遞參數作為屬性附加到該對象上并返回新對象。 這是一個簡單的 JavaScript 工廠函數。

實際上工廠函數也很好理解了:

  • 它是一個函數。
  • 它用來創建對象。
  • 它像工廠一樣,“生產”出來的函數都是“標準件”(擁有同樣的屬性)

構造函數

不同于其它的主流編程語言,JavaScript的構造函數并不是作為類的一個特定方法存在的;當任意一個普通函數用于創建一類對象時,它就被稱作構造函數,或構造器。一個函數要作為一個真正意義上的構造函數,需要滿足下列條件:

  • 在函數內部對新對象(this)的屬性進行設置,通常是添加屬性和方法。
  • 構造函數可以包含返回語句(不推薦),但返回值必須是this,或者其它非對象類型的值。
function Person(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age;}

使用 new 關鍵字創建對象

正如上面所說的,我們可以使用 new 來類或者對象,那么你可能會有以下幾個問題:

  • 我們可以在工廠函數中使用 new 關鍵字嗎?
  • 如果我們在工廠和構造函數中使用new關鍵字會發生什么
  • 如果在使用構造函數創建對象實例時不使用new關鍵字會發生什么

好的,試著找出以上問題的答案之前,我們先做一個小練習來理解這里面發生了什么。

使用new關鍵字同時使用工廠和構造函數創建兩個對象,接著在控制臺打印這兩個對象。

使用工廠函數

function person(firstName, lastName, age){ const person = {} person.firstName = firstName; person.lastName = lastName; person.age = age; return person;}const mike = new person('mike', 'grand', 23);

JavaScript,工廠函數,構造函數

正如我們在上述所看到的,這里的__proto__ 指向其原型對象的指針,讓我們試著找出原型對象是什么。為了找出上面mike對象的指向原型對象,讓我們做簡單的===等式檢查。

JavaScript,工廠函數,構造函數

嗯,有趣的是,它指向 Object.prototype。好的,讓我們用構造函數做同樣的實驗。

理解 JavaScript 的原型

理解原型之前,需要記住以下幾點知識:

  • 所有的引用類型(數組、對象、函數),都具有對象特性,即可自由擴展屬性(null除外)
  • 所有的引用類型(數組、對象、函數),都有一個__proto__屬性,屬性值是一個普通的對象
  • 所有的函數,都有一個prototype屬性,屬性值也是一個普通的對象
  • 所有的引用類型(數組、對象、函數),__proto__屬性值指向它的構造函數的prototype屬性值

通過代碼解釋一下:

// 要點一:自由擴展屬性var obj = {}; obj.a = 100;var arr = []; arr.a = 100;function fn () {}fn.a = 100;// 要點二:__proto__console.log(obj.__proto__);console.log(arr.__proto__);console.log(fn.__proto__);// 要點三:函數有 prototypeconsole.log(fn.prototype)// 要點四:引用類型的 __proto__ 屬性值指向它的構造函數的 prototype 屬性值console.log(obj.__proto__ === Object.prototype)

使用構造函數

注意:在JavaScript中,這些構造函數也被稱為 constructor,因為它們用于創建對象。

function Person(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age;}const mike = new Person('mike', 'grand', 23);

JavaScript,工廠函數,構造函數

當我們展開第一層的的__proto__時,它內部還有另一個__proto__,我們再次擴展它。

JavaScript,工廠函數,構造函數

現在讓我們試著弄清楚原型對象是否像上面一樣。

JavaScript,工廠函數,構造函數

他們是不同的。 當我們使用工廠函數創建對象時,它的__proto__指向Object.prototype,而當從構造函數創建對象時,它指向它的構造函數原型對象。 那么這里發生了什么?

new 背后所做的事

當我們在創建對象時使用帶有構造函數的new關鍵字時,new 背后所做的事不多。

new 運算符創建一個用戶自定義的對象類型的實例或具有構造函數的內置對象的實例。 new 關鍵字會進行如下操作:

  • 創建一個空的簡單 JavaScript 對象 (即 {})
  • 鏈接該對象(即設置該對象的構造函數)到另一個對象
  • 將步驟1新創建的對象作為 this 的上下文
  • 如果該函數沒有返回對象,則返回 this

注釋行是偽代碼,表示在 new 關鍵字,JS 背后幫我們做的事情。

function Person(firstName, lastName, age) { // this = {}; // this.__proto__ = Person.prototype; this.firstName = firstName; this.lastName = lastName; this.age = age;  // return this;}

另外,讓我們看看如果將上面的隱式代碼添加到工廠函數中會發生什么。

function person(firstName, lastName, age) { // this = {}; // this.__proto__ = Person.prototype;    const person = {}; person.firstName = firstName; person.lastName = lastName; person.age = age; return person;  // return this;}

即使使用new關鍵字調用時將隱式代碼添加到工廠函數中,也不會對結果產生任何影響。這是因為,由于我們沒有在函數中使用 this 關鍵字,而且我們顯式地返回了一個除this之外的自定義對象,因此沒有必要使用隱式代碼。無論我們是否對工廠函數使用new關鍵字,對輸出都沒有影響。

如果忘記了 new 關鍵字怎么辦

JavaScript 中有許多概念,有時難以掌握。 new 操作符就是其中之一。 如果你不能正確理解它,那么在運行 JavaScript 應用程序時會產生令人討厭的后果。 在像 Java這 樣的語言中,嚴格限制了如何使用 new 關鍵字。 但是在 javascript 中,并不是那么嚴格,如果你不能正確理解它們可能會導致很多問題。

在 JavaScript 中:

  • 可以對任何函數使用 new 運算符
  • 可以使用或不使用 new 關鍵字將函數作為構造函數調用

讓我們看看上面的例子,使用和不使用 new 關鍵情況

function Person(firstName, lastName, age) {this.firstName = firstName;this.lastName = lastName;this.age = age;}const mike = new Person('mike', 'grand', 23);const bob = Person('bob', 'grand', 23);

然后,如果查看創建的對象實例,你希望看到什么?

JavaScript,工廠函數,構造函數

發生了什么? 使用 new 運算符,正如我們所期待的一樣輸出正確的對象,但沒有new運算符,結果是undefined 怎么可能呢?

如果你對 JavaScript 作用域 和 this 關鍵字的工作原理有所了解,那么你可以猜到這里發生了什么? 讓我們來看看。

JavaScript,工廠函數,構造函數

看起來我們傳遞給沒有new關鍵字的函數的所有屬性都已設置為window對象。 那是因為到那個時候函數內部的這個變量引用了global 或 window 對象,基本上我們在這里做的就是污染了全局對象。

這是你可以對你的JavaScript程序做的非常討厭的事情。 因此,使用new運算符,JavaScript引擎將this 變量設置為引用新創建的對象實例,這就是為什么我們可以看到傳遞給構造函數的所有屬性都已設置為 mike。

但是在沒有new運算符的情況下調用構造函數的情況下,JavaScript 引擎會將 this 解釋為常規函數調用,而沒有顯式返回語句時返回undefined。 這就是理解new 運算符在JavaScript中的工作原理非常關鍵的原因。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频网站| 综合网中文字幕| 午夜精品久久久久久久男人的天堂| 欧美交受高潮1| 91成品人片a无限观看| 精品露脸国产偷人在视频| 亚洲男子天堂网| 亚洲国产精品va在线看黑人| 久久久久久久影视| 麻豆一区二区在线观看| 97视频在线看| 青青青国产精品一区二区| 欧美激情一区二区久久久| 日本伊人精品一区二区三区介绍| 欧美国产日韩一区二区在线观看| 国产香蕉一区二区三区在线视频| 日韩在线观看免费网站| 亚洲成人1234| 在线成人激情视频| 伊人一区二区三区久久精品| 91精品国产99| 国产伦精品一区二区三区精品视频| 日本一区二区不卡| 精品日韩美女的视频高清| 亚洲欧洲国产伦综合| 亚洲精品日韩久久久| 亚洲精品视频在线播放| 成人国产亚洲精品a区天堂华泰| 亚洲精品福利资源站| 国产日韩欧美自拍| 欧美在线视频网| 国产日韩视频在线观看| 欧美肥老妇视频| 久久久日本电影| 91精品在线国产| 亚洲韩国日本中文字幕| 91在线免费看网站| 久久久久久久久电影| 亚洲男女性事视频| 国产亚洲免费的视频看| 亚洲精品久久久久久久久久久| 欧美一级电影免费在线观看| 日韩av在线播放资源| 成人激情综合网| 日韩中文字幕视频在线观看| 国产在线视频不卡| 国产不卡视频在线| 国产日韩欧美成人| 亲爱的老师9免费观看全集电视剧| 欧美一区二区色| 国产剧情日韩欧美| 亚洲国产成人久久综合| 久久久99免费视频| 国产精品美女在线观看| 精品久久中文字幕久久av| 久久视频国产精品免费视频在线| 色悠悠久久久久| 亚洲欧美福利视频| 秋霞午夜一区二区| 国产精品久久97| 精品视频在线观看日韩| 成人久久精品视频| 亚洲性69xxxbbb| 久久久综合免费视频| 久久精品一偷一偷国产| 日韩综合视频在线观看| 欧美日韩在线免费观看| 青青久久aⅴ北条麻妃| 国产综合在线观看视频| 成人久久18免费网站图片| 亚洲小视频在线观看| 91av中文字幕| 国产精品视频久| 精品亚洲一区二区三区在线播放| 欧美在线视频网站| 国产精品视频一区二区三区四| 久久久久久com| 亚洲综合视频1区| 夜色77av精品影院| 欧美日本高清视频| 成人亚洲综合色就1024| 国产日韩中文在线| 日韩在线视频导航| 国产免费一区二区三区香蕉精| 国产精品久久久久久久久久三级| 98精品国产自产在线观看| 亚洲综合最新在线| 欧美大全免费观看电视剧大泉洋| 色综合视频网站| 国产精品久久久久久网站| 亚洲欧美日韩在线高清直播| 欧美国产激情18| 国产精品高潮呻吟久久av黑人| 91久久国产综合久久91精品网站| 欧美综合在线观看| 国产视频综合在线| 欧美激情日韩图片| 久久久精品欧美| 青青草成人在线| 中文字幕精品在线| 久久伊人精品一区二区三区| 午夜精品福利在线观看| 久久九九亚洲综合| 国产亚洲一区二区精品| 欧美亚洲成人网| 亚洲国产婷婷香蕉久久久久久| 亚洲图片欧洲图片av| 久久av红桃一区二区小说| 欧美视频免费在线观看| 黑人欧美xxxx| 久久久久久中文| 国产成人精品在线| 亚洲色图欧美制服丝袜另类第一页| 国产精品揄拍一区二区| 成人444kkkk在线观看| 欧美性猛交xxxx黑人| 日本电影亚洲天堂| 欧美在线免费看| 精品久久久久久久久久久久久久| 在线观看日韩欧美| 欧美激情按摩在线| 国产日产欧美a一级在线| 7777kkkk成人观看| 亚洲图中文字幕| 隔壁老王国产在线精品| 亚洲天堂视频在线观看| 夜夜躁日日躁狠狠久久88av| 在线成人激情黄色| 亚洲免费视频观看| 欧美激情va永久在线播放| 亚洲国产成人精品久久久国产成人一区| 久久久久久亚洲精品中文字幕| 大胆欧美人体视频| 亚洲毛片在线观看| 国产精品揄拍500视频| 亚洲一区二区三| 日韩电影中文字幕在线| 中文在线资源观看视频网站免费不卡| 国产精品视频区| 成人午夜在线观看| 91大神福利视频在线| 久久九九国产精品怡红院| 国产精品一二三在线| 日韩小视频在线| 欧美在线播放视频| 亚洲欧美成人在线| 成人有码在线视频| 蜜月aⅴ免费一区二区三区| 国产精品影院在线观看| 最近中文字幕mv在线一区二区三区四区| 日韩精品999| 欧美福利视频在线| 国产成人亚洲综合青青| 国产精品igao视频| 日韩精品免费在线视频| 久久久亚洲福利精品午夜| 亚洲影院污污.| 热久久视久久精品18亚洲精品| 国产精品一区二区三区久久| 国产97人人超碰caoprom| 精品中文字幕在线2019| 日韩av三级在线观看| 久久免费视频网| 在线播放亚洲激情|