2012-05-09 59 views
0

如果我想創造一個javascript「類」具有兩個屬性防止javascript函數,我可能會做這樣的事情:意外使用全局窗口

var Person = function (firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 

然後我可以創建新的聯繫人如下:

var p = new Person("John", "Doe"); 
console.log(p.firstName + " " + p.lastName); 

在這一點上,一切都很好。但是,如果有人不小心(或故意)調用以下:

Person("Mary", "Smith"); // without "new" 

突然之間,firstNamelastName在全局窗口上下文的一部分,並有可能搞砸了整個頁面。

console.log(window.firstName); // logs "Mary" 

有沒有設法防止這種情況,建設Person「下課」時的好辦法?顯然,如果有人想在javascript中打破某些東西,他們可以做到,但我只是在尋找最佳做法。

我可以在類的頂部拋出這樣的事情,但我不知道這是一個很好的答案:

if (this === window) { 
    console.log("You are fail"); 
    return; 
} 
+2

您很快就會發現錯誤,只需最少的測試,因爲如果函數調用時沒有'new',它將返回'undefined'而不是期望的對象。比嘗試隱藏錯誤更好地嘗試失敗。 – RobG

回答

3

您可以檢查,看看是否thisinstanceof Person

var Person = function (firstName, lastName) { 
    if (!(this instanceof Person)) 
     throw "Person constructor called without \"new\"." 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 

或者讓它回憶起適當的構造函數。

var Person = function (firstName, lastName) { 
    if (!(this instanceof Person)) 
     return new Person(firstName, lastName) 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 

另一種可能性是有嚴格的模式下運行的功能。這將導致this在該方案中爲undefined,導致TypeError,但僅在受支持的實現中。

var Person = function (firstName, lastName) { 
    "use strict"; 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 
+1

我喜歡這個比我最後一個比較'this'和'window'的代碼片段更好。 –

+0

我也喜歡你的第二個例子 - 使它更寬容。並不總是正確的做法,但這絕對是一個好主意。 –

+0

我將不得不研究''嚴格使用''多一點 - 這看起來很有趣。 –