JavaScript 中,new 的構造函數后面加括號與不加括號的區別


首先有這么樣一段代碼:

    function Fn() {
        this.age = 1;
    }
    var a = new Fn;
    var b = new Fn();

a 和 b 的的結果都是一樣的,是一個實例,都有一個 age 屬性,那如果在聲明的時候就去調用這個屬性呢?

    function Fn() {
        this.age = 1;
    }
    var a = new Fn.age;     // 報錯
    var b = new Fn().age;   // 1

那是為什么呢,究其原因是運算符優先級的問題,new 的運算優先級要小於 . 的運算優先級,所以:

    new Fn.age 拆分:
    var a = Fn.age
    var b = new a

因為並不是先執行 new Fn 再屬性訪問的,所以那顯然 b 並不是一個構造函數,所以就會報一個 Fn.age 不是一個構造函數的錯誤。但是如果后面加了一個括號:

    new Fn().age 拆分:
    var a = new Fn
    var b = a.age

那就是先執行 new ,再從 new 生成的實例中訪問 age 這個屬性。運算符優先級詳細請參考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

現在額外擴展一下,把 Fn 改改:

    function Fn() {
        this.age = 1;
    }
    Fn.age = function () {
        this.age = 10
    }
    var a = new Fn.age;           // 實例
    var b = new Fn.age().age;     // 10
    var c = new Fn().age;         // 1

相信經過這么改造的一個過程,對這個的執行順序就能有一個小透徹的理解了。

所以這里個人理解,在 new 的時候后面的括號不是執行的意思,是將這一塊的優先級提升上去了.

具體的理解也可以參考 ECMA2015 的規范,對這一塊還沒有研究透,后續有收獲的話會隨時補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM