[JS奇怪的世界]No.52 危險小叮嚀:「new」與函數

前言

這章節是關於「new」與函數的危險小叮嚀,在前面我們有大致上講過,當加上 new 時,會建立空的物件,然後 this 會指向空的物件,如果你不回傳任何東西的話,它會回傳新物件,但這邊就是函數危險的地方。

「new」與函數

如果今天我們忘記加上 new 會發生什麼事情呢?

1
2
3
4
5
6
7
8
9
function Person(first, last) {
console.log(this);
this.firstname = first;
this.lastname = last;
}

var john = Person('John', 'Doe');

console.log(john);

第一個我們可以發現 this 指向了 window,然後 JavaScript 並不知道我們要對這個函數執行,對他來講只是一個函數,也因為這樣子所以他只會回傳 undefined。

那這樣會有甚麼問題?當我們取用 proto 就會出現錯誤。

1
2
3
4
5
6
7
8
9
10
11
12
function Person(first, last) {
console.log(this);
this.firstname = first;
this.lastname = last;
}
Person.prototype.getFullName = function() {
return this.firstname + ' ' + this.lastname;
}

var john = Person('John', 'Doe');

console.log(john.getFullName());

這個錯誤是因為 john 是一個 undefined,所以無法取得方法。

通常這都是大家認為的函數建構子缺點,但如果我們遵照一些規範來設計的話,就可以減少一些問題,例如任何我們要作為函數建構子的函數首字
母寫成大寫,第一個字母大寫,這樣子會比較方便於 debug,而這是一個傳統方式。

任何我們要作為函數建構子的函數,永遠都要第一個字母大寫作為建構子名稱。

圖源

JavaScript 全攻略:克服 JS 奇怪的部分

0%