2013-02-03 63 views
1

好日子大家,的JavaScript:增廣對象/函數原型避免名稱衝突

有擴充的JavaScript對象和功能元素avoinding衝突問題的方法?讓我更具體:

假設我有2個.js文件:

ex1.js已經Object.prototype.aMethod=function(){/*a function*/}

ex2.js已經Object.prototype.aMethod=function(){/*another function*/}

在這種情況下,ex1.js增強的被ex2.js上的一個覆蓋。

我的問題:

有沒有辦法到增強的影響限制在他的文件上下文,或者更好的,一個模塊環境?

編輯:

其實,我讀Crockford的書」的JavaScript:好的部分,在那裏他使用對象及功能正常的東西做的原型增強,而不談的衝突問題。這很奇怪,因爲這本書傾向於不污染全球命名空間。所以我認爲必須有某種解決方法。

+3

你不應該改變全局的'Object.prototype'。 – 0x499602D2

+0

大衛是對的。你如何解釋你正在試圖用這個做什麼,我們可以建議你應該如何做不同。 – Jivings

+0

我認爲克羅克福德解釋爲什麼變異對象是錯誤的。你至少應該使用'aMethod(thisObj,args ...)'而不是'thisObj.aMethod(args ...)'。 – 0x499602D2

回答

2

如果要修改的對象是全局對象,則原型修改是全局的。爲了支持你想做什麼,你可以使用一個模塊本地原型:

var MyObject = function(properties) { 
    var key; 
    for(key in properties) { 
    if(properties.hasOwnProperty(key)) { 
     this[key] = properties[key]; 
    } 
    } 
}; 

MyObject.prototype.aMethod = function() { 
    console.log(this.name); 
} 

var obj = new MyObject({name: "blah"}); 
obj.aMethod(); 

// Prints "blah" 

修改Object.prototype通常被認爲是JavaScript的「邪惡」,因爲繼承的屬性上的每個for-in循環出現之後。請注意修改Object.prototype與修改Object對象不同,該對象通常是Sugar.JS等庫。

+0

我明白了。這對於什麼是值得的,似乎有點麻煩。本地增強是我應該使用的東西,當我確定我在受控環境中工作。感謝您的回覆 –

+0

由於'for..in'循環,問題通常出現在'Object.prototype'上。修改'Array.prototype','String.prototype'和其他通常並不麻煩。值得注意的是,一些庫,比如jQuery,假定你不修改Object.prototype。 –