2013-02-03 65 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。 –