2016-07-10 40 views
1

我基本上只想知道是否存在一些標準方法來防止將方法/屬性添加到JavaScript對象中?防止將屬性添加到JavaScript對象

作爲一名C++程序員,看起來您可能會遇到很多令人頭痛的事情,試圖調試JavaScript代碼,因爲它允許您即時向對象添加屬性,特別是在大型代碼庫中。

+0

不,沒有。 –

+0

嗯,那是JS的雅:-) – 1sloc

+0

如果你真的只是試圖阻止或檢測到所有對象的錯誤的屬性名稱賦值(如你的意見中的建議)意外打字問題,那麼Javascript真的不支持,並且通常與您通常使用Javascript的方式不一致。正如其他地方所說的,你可以使用'Object.freeze()','Object.seal()',但這可能妨礙正常的對象操作。如果你渴望這個功能,那麼你可能更喜歡使用類似TypeScript的東西。 – jfriend00

回答

3

有一種排序,ES5.1 Object.freeze函數可以防止添加新的屬性,以及防止現有的屬性改變。

工作實例:

var o = { 
 
    a: 123 
 
}; 
 
o.b = 456; 
 

 
// Freeze the object. 
 
Object.freeze(o); 
 

 
// Log the object. 
 
console.log(o); 
 

 
// These do nothing, properties do not change and are not added. 
 
o.b = 0; 
 
o.c = 789; 
 

 
// Log the object. 
 
console.log(o);

話雖這麼說,JavaScript是一種超級動態語言,所以這樣做廣泛的可以看作是一個反模式。

如果凍結過於嚴格,其他選項包括Object.preventExtensionsObject.seal,具體取決於您希望防止的情況。

或者ES6 Proxy objects可以提供對可以添加或修改哪些屬性的更多控制。

+0

啊對不起,我可能有點奇怪地解釋了我的問題。我想看看其他迴應我所追求的是不是真的可能。坦率地說,我認爲我所認爲的代碼歧義問題並不重要,至少就我個人的項目而言,但我可以看到在大型代碼庫中發現錯誤時有一些非常可怕的地方,人們會說:car.age = 3; car.Age = 4; log(car.age) – George

+0

您可能也喜歡object.seal()和/或object.preventExtensions() – JonSG

+0

@JonSG好的電話,我忘了他們。 –

0

不是。有可能的方法來配置你不希望能夠附加新屬性的對象,但沒有任何實用或標準化的東西。主要是一個JavaScript開發人員,我不認爲這是一個問題。我相信typescript會爲這個接口做些什麼,如果你開始附加它不期望的屬性,它會發出警告。很多javascript開發人員不是這樣的粉絲,但你可能想試一試https://www.typescriptlang.org/docs/tutorial.html