首先有這么樣一段代碼:
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 的規范,對這一塊還沒有研究透,后續有收獲的話會隨時補充。