javascript - 這不是物件字面量函數嗎?為什麼要new初始化?
淡淡烟草味
淡淡烟草味 2017-07-05 10:52:40
0
4
893

##我記得這個不是建構子啊,為什麼this、new這些都跟建構子用法一樣?

淡淡烟草味
淡淡烟草味

全部回覆(4)
学习ing

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 物件。

小葫芦

javascript 裡面沒有類,也沒有建構子。

function Book (){}

// Book 是一个函数
typeof Book
"function"

// Book 是 Function
Book instanceof Function
true

// Book 是 Object
Book instanceof Object
true

使用 new 可以建立物件

var book = new Book()

// book 是一个对象
typeof book
"object"

// book 不是 Function 的实例
book instanceof Function
false

// book 是 Object 的实例
book instanceof Object
true

// book 是 Book 的实例
book instanceof Book
true

雖然 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"
女神的闺蜜爱上我

你理解錯了構造函數的概念。

實際上,js裡不應該有『建構子』這一說,而應該理解為函數的建構方法。意思是,任何函式都可以拿來new一個,任何函式都可以叫做『建構子』。你在寫所謂『構造函數』的時候,有發現它和普通函數有什麼差別嗎,並沒有吧,他們就是普通函數。

以上,es6箭頭函數除外。

習慣沉默

js裡面每個函數都是相當於一個建構子(除了真ES6箭頭函數)。
哎,神奇的js!

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板