javascript - 這不是對象字面量函數(shù)嗎?為什么要new初始化?
問題描述
我記得這個不是構(gòu)造函數(shù)啊,為什么this、new這些都跟構(gòu)造函數(shù)用法一樣?
問題解答
回答1:javascript 中的任何函數(shù)只要用 new 關(guān)鍵字調(diào)用,它都可以被稱作 構(gòu)造函數(shù)。
當(dāng)使用 new 關(guān)鍵字調(diào)用函數(shù)時,函數(shù)內(nèi)部會隱式地聲明一個對象,然后把這個對象賦給 this,最后再隱式地返回 this. 使用 new 關(guān)鍵字調(diào)用樓主的 book 方法時,就相當(dāng)于以下過程。
function Book(id, bookname){ var o = new Object(); o.id = id; o.bookname = bookname; return o;}var b = Book(123,’javascript高級程序設(shè)計’);
這里的 o 其實就是我們平時看到的 this 對象。
回答2:javascript 里面沒有類,也沒有構(gòu)造函數(shù)。
function Book (){}// Book 是一個函數(shù)typeof Book'function'// Book 是 FunctionBook instanceof Functiontrue// Book 是 ObjectBook instanceof Objecttrue
使用 new 可以創(chuàng)建對象
var book = new Book()// book 是一個對象typeof book'object'// book 不是 Function 的實例book instanceof Functionfalse// book 是 Object 的實例book instanceof Objecttrue// book 是 Book 的實例book instanceof Booktrue
雖然 js 中沒有構(gòu)造函數(shù),但是 MDN 文檔中也使用了這個詞:https://developer.mozilla.org...
當(dāng)代碼 new foo(...) 執(zhí)行時:
一個新對象被創(chuàng)建。它繼承自 foo.prototype.
構(gòu)造函數(shù) foo 被執(zhí)行。執(zhí)行的時候,相應(yīng)的傳參會被傳入,同時上下文(this)會被指定為這個新實例。new foo 等同于 new foo(), 只能用在不傳遞任何參數(shù)的情況。
如果構(gòu)造函數(shù)返回了一個“對象”,那么這個對象會取代整個new出來的結(jié)果。如果構(gòu)造函數(shù)沒有返回對象,那么new出來的結(jié)果為步驟1創(chuàng)建的對象,ps:一般情況下構(gòu)造函數(shù)不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通對象來覆蓋。當(dāng)然,返回數(shù)組也會覆蓋,因為數(shù)組也是對象。
即使 ES6 增加了類,也只是語法糖:
class Book{}typeof Book'function'回答3:
你理解錯了構(gòu)造函數(shù)的概念。
實際上,js里不應(yīng)該有‘構(gòu)造函數(shù)’這一說,而應(yīng)該理解為函數(shù)的構(gòu)造方法。意思是,任何函數(shù)都可以拿來new一個,任何函數(shù)都可以叫做‘構(gòu)造函數(shù)’。你在寫所謂‘構(gòu)造函數(shù)’的時候,有發(fā)現(xiàn)它和普通函數(shù)有什么區(qū)別嗎,并沒有吧,他們就是普通函數(shù)。
以上,es6箭頭函數(shù)除外。
回答4:js里面每個函數(shù)都是相當(dāng)于一個構(gòu)造函數(shù)(除了真ES6箭頭函數(shù))。哎,神奇的js!
相關(guān)文章:
1. mysql - 分庫分表、分區(qū)、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處2. javascript - 能否讓vue-cli的express修改express重啟服務(wù)3. python bottle跑起來以后,定時執(zhí)行的任務(wù)為什么每次都重復(fù)(多)執(zhí)行一次?4. javascript - 求幫助 , ATOM不顯示界面!!!!5. html5 - HTML代碼中的文字亂碼是怎么回事?6. javascript - vue2如何獲取v-model變量名7. javascript - ios返回不執(zhí)行js怎么解決?8. 前端 - 誰來解釋下這兩個 CSS selector 區(qū)別9. javascript - angular使從elastichearch中取出的文本高亮顯示,如圖所示10. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題
