new
與建構式函式
JavaScript 沒有 Class。所以建構式即是函式又能夠稱為建構式函式。
function Car() {
this.name = 'SYM';
this.go = function () {
console.log('Go with ' + this.name);
};
}
var moto = new Car();
moto.go(); // Go with SYM
加上 new
了關鍵字你可看做 JavaScript 執行時期時會解析成如下:
function Car() {
var this = {};
// ...略
return this;
}
var moto = new Car();
moto.go(); // Go with SYM
若要在建構式函式 return
必須是物件型別,不能為原始型別。
function Car() {
this.name = 'BMW';
return ['BMW', '$10000'];
}
function Cow() {
this.name = 'Cow';
return 'Cow';
}
var bmw = new Car();
var cow = new Cow();
console.log(bmw); // ?
console.log(cow); // ?
若設計之函式專門是用來實例化,建議首字可以大寫做為區隔。
但使用的開發人員忘了加 new
不就 this
指向到根物件進而全域汙染了嗎 ?
這裡提供一個技巧
function Car() {
if(!(this instanceof Car)) {
return new Car();
}
this.name = 'BMW';
this.go = function () { console.log('Go with ' + this.name) };
}
var bmw = Car();
bmw.go();
instanceof
可以用來確認對象是否為特定建構式繼承