学习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 物件。
高洛峰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"
女神的闺蜜爱上我2017-07-05 10:54:40
你理解錯了構造函數的概念。
實際上,js裡不應該有『建構子』這一說,而應該理解為函數的建構方法。意思是,任何函式都可以拿來new
一個,任何函式都可以叫做『建構子』。你在寫所謂『構造函數』的時候,有發現它和普通函數有什麼差別嗎,並沒有吧,他們就是普通函數。
以上,es6箭頭函數除外。