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 可以用來確認對象是否為特定建構式繼承

results matching ""

    No results matching ""