建構函數的原理
JavaScript語言是一門物件導向的語言,但是JavaScript中並沒有類別的概念的。於是JavaScript採用建構函數的方式來模擬類別的效果,也就是我們透過函數來建立物件。這也證明了函數在JavaScript中具有非常重要的地位。舉例:
var Book = function(name, price) {
}
var java = new Book('Master Java', 82);
當使用new關鍵字來呼叫建構函式時,執行上下文從全域變數物件(window)變成一個空的上下文,這個上下文代表了新產生的實例。因此,this關鍵字指向目前建立的實例
預設情況下,如果你的建構函式中沒有回傳任何內容,就會回傳this----目前的上下文,也就是你目前建立的物件。要不然就傳回任意非原始類型的值。而普通的函數如果沒有明顯的回傳值將會回傳undefined。
模擬建構子建立物件
其實使用new建立物件的過程並不神秘,我們可以使用程式碼模擬如何建立物件:
//正常用法
var java = new Book('Master Java');
var python = {};
Book.call(python, 'Master Python');
將建構子作為普通函數呼叫
實際上構造函數是個普通的函數,例如普通函數的= Book();,當然結果是undefined。差別在於函數中this的指向。讓我們重新修改上面的建構函數,
var Book = function(name, price) {
this == window) {
return 'name = ' + name + ", price = " + price;
}
這樣當執行 Java result = Book("", 100) 的結果是使用Book("Java", 100)的結果就是創建了一個新的物件。 JavaScript自帶的建構函式好多就是既當普通函式又當建構函式的。例如String和Number,當String和Number作為建構子使用時,
var a = new Number(11);
);
當String和Number作為普通函數來使用時,他們可以用來作型別轉換,即Number函數可以將其它型別轉換為number型,String函數可以將其它型別轉換為字串,
var b = Number('hello'); //NaN
var c = String(11); //'11' var c = String(11); //'11'
); null'
總結
當一個函數要作為構造函數使用時通常將函數名首字母大寫表示這是個構造函數,同時,一定要用new去調用構造函數。另外盡量不要把構造函數做普通函數使用,因為容易產生全域變量,同時如果處理不好回傳值容易對構造函數本身的功能產生影響。