首先要說明的是,測試的是沒有問題的,只是在書中描述不夠詳細導致了誤導;而我認為真正的描述應該是:“如果建構函式有顯式返回一個物件,運算子new所建立的物件會被丟棄,返回值將作為new表示式的值”;
如果要真正的理解原因,首先我們得知道在js中,new到底是幹什麼用的,在背後又具體做了什麼?
概念:new 運算子建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。
那麼,當使用new建立物件時,發生了什麼事情呢?以new Foo(...)為例:
1、一個繼承自Foo.prototype 的新物件被建立;
2、使用指定引數呼叫建構函式Foo;並將this繫結到新建立的物件
3、由建構函式返回的物件就是 new 表示式的結果。如果建構函式沒有顯式返回一個物件,則使用步驟1建立的物件。一般情況下,建構函式不會返回值,但是開發人員也可以主動返回一個物件去覆蓋正常預設建立的物件;
所以,由上,我們可以簡單猜測new運算子的執行如下函式:
所以,綜上,書中描述應該是當建構函式返回物件時,如,物件、陣列、函式等只要滿足_return instanceof Object為true的,都會進行覆蓋;
首先要說明的是,測試的是沒有問題的,只是在書中描述不夠詳細導致了誤導;而我認為真正的描述應該是:“如果建構函式有顯式返回一個物件,運算子new所建立的物件會被丟棄,返回值將作為new表示式的值”;
如果要真正的理解原因,首先我們得知道在js中,new到底是幹什麼用的,在背後又具體做了什麼?
概念:new 運算子建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。
那麼,當使用new建立物件時,發生了什麼事情呢?以new Foo(...)為例:
1、一個繼承自Foo.prototype 的新物件被建立;
2、使用指定引數呼叫建構函式Foo;並將this繫結到新建立的物件
3、由建構函式返回的物件就是 new 表示式的結果。如果建構函式沒有顯式返回一個物件,則使用步驟1建立的物件。一般情況下,建構函式不會返回值,但是開發人員也可以主動返回一個物件去覆蓋正常預設建立的物件;
所以,由上,我們可以簡單猜測new運算子的執行如下函式:
所以,綜上,書中描述應該是當建構函式返回物件時,如,物件、陣列、函式等只要滿足_return instanceof Object為true的,都會進行覆蓋;