首頁  >  問答  >  主體

javascript - 這不是物件字面量函數嗎?為什麼要new初始化?

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

淡淡烟草味淡淡烟草味2663 天前841

全部回覆(4)我來回復

  • 学习ing

    学习ing2017-07-05 10:54:40

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

    回覆
    0
  • 高洛峰

    高洛峰2017-07-05 10:54:40

    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"
    

    回覆
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-05 10:54:40

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

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

    以上,es6箭頭函數除外。

    回覆
    0
  • 習慣沉默

    習慣沉默2017-07-05 10:54:40

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

    回覆
    0
  • 取消回覆