javascript - 這不是對象字面量函數嗎?為什么要new初始化?
問題描述
我記得這個不是構造函數啊,為什么this、new這些都跟構造函數用法一樣?
問題解答
回答1:javascript 中的任何函數只要用 new 關鍵字調用,它都可以被稱作 構造函數。
當使用 new 關鍵字調用函數時,函數內部會隱式地聲明一個對象,然后把這個對象賦給 this,最后再隱式地返回 this. 使用 new 關鍵字調用樓主的 book 方法時,就相當于以下過程。
function Book(id, bookname){ var o = new Object(); o.id = id; o.bookname = bookname; return o;}var b = Book(123,’javascript高級程序設計’);
這里的 o 其實就是我們平時看到的 this 對象。
回答2:javascript 里面沒有類,也沒有構造函數。
function Book (){}// Book 是一個函數typeof Book'function'// Book 是 FunctionBook instanceof Functiontrue// Book 是 ObjectBook instanceof Objecttrue
使用 new 可以創建對象
var book = new Book()// book 是一個對象typeof book'object'// book 不是 Function 的實例book instanceof Functionfalse// book 是 Object 的實例book instanceof Objecttrue// book 是 Book 的實例book instanceof Booktrue
雖然 js 中沒有構造函數,但是 MDN 文檔中也使用了這個詞:https://developer.mozilla.org...
當代碼 new foo(...) 執行時:
一個新對象被創建。它繼承自 foo.prototype.
構造函數 foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新實例。new foo 等同于 new foo(), 只能用在不傳遞任何參數的情況。
如果構造函數返回了一個“對象”,那么這個對象會取代整個new出來的結果。如果構造函數沒有返回對象,那么new出來的結果為步驟1創建的對象,ps:一般情況下構造函數不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通對象來覆蓋。當然,返回數組也會覆蓋,因為數組也是對象。
即使 ES6 增加了類,也只是語法糖:
class Book{}typeof Book'function'回答3:
你理解錯了構造函數的概念。
實際上,js里不應該有‘構造函數’這一說,而應該理解為函數的構造方法。意思是,任何函數都可以拿來new一個,任何函數都可以叫做‘構造函數’。你在寫所謂‘構造函數’的時候,有發現它和普通函數有什么區別嗎,并沒有吧,他們就是普通函數。
以上,es6箭頭函數除外。
回答4:js里面每個函數都是相當于一個構造函數(除了真ES6箭頭函數)。哎,神奇的js!
相關文章:
1. javascript - vue2如何獲取v-model變量名2. javascript - 求幫助 , ATOM不顯示界面!!!!3. html5 - HTML代碼中的文字亂碼是怎么回事?4. javascript - vue2.0中,$refs對象為什么用駝峰的方式獲取不到屬性?5. python bottle跑起來以后,定時執行的任務為什么每次都重復(多)執行一次?6. 解決Android webview設置cookie和cookie丟失的問題7. javascript - nodejs使用mongoose連接數據庫,使用post提交表單在后臺,后臺處理后調用res.redirect()跳轉界面無效?8. javascript - 能否讓vue-cli的express修改express重啟服務9. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題10. html5 - 急求?被公司問住了
