JavaScript:增强对象/函数原型以避免名称冲突

JavaScript:增强对象/函数原型以避免名称冲突,javascript,prototype,conflict,Javascript,Prototype,Conflict,大家好 是否有一种方法可以增强javascript对象和函数元素,从而避免冲突问题?让我更具体地说: 假设我有2个.js文件: ex1.js有Object.prototype.aMethod=function(){/*a function*/} ex2.js有Object.prototype.aMethod=function(){/*另一个函数*/} 在这种情况下,ex1.js扩展被ex2.js上的扩展覆盖 我的问题: 有没有一种方法可以将增强的效果限制在文件上下文中,或者更好地限制在模块上下文

大家好

是否有一种方法可以增强javascript对象和函数元素,从而避免冲突问题?让我更具体地说:

假设我有2个.js文件:

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

ex2.js有
Object.prototype.aMethod=function(){/*另一个函数*/}

在这种情况下,ex1.js扩展被ex2.js上的扩展覆盖

我的问题:

有没有一种方法可以将增强的效果限制在文件上下文中,或者更好地限制在模块上下文中

编辑:


事实上,我正在读crockford的书JavaScript:the good parts,在书中,他使用对象和函数的原型增强作为正常的操作,而没有讨论冲突问题。这很奇怪,因为这本书倾向于不污染全局名称空间。所以我想一定有解决办法

如果要修改的对象是全局对象,则原型修改是全局的。为了支持您正在尝试的工作,您可以使用模块本地原型:

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
循环中。请注意,修改
对象。prototype
不同于修改
对象
对象,这是库通常所做的。

您不应该修改全局
对象。prototype
。David是对的。你解释一下你想用这个做什么,我们可以建议你应该如何做不同的事情。我认为Crockford开始解释为什么变异
对象
是错误的。你至少应该使用
aMethod(thisObj,args…
而不是
thisObj.aMethod(args…
),我明白了。就价值而言,这似乎有点麻烦。当我确信自己在受控环境中工作时,我应该使用本机增强。感谢您的回答此问题通常在于
对象.prototype
,因为
for..in
循环。修改
Array.prototype
String.prototype
和其他文件通常不会那么麻烦。需要注意的是,一些库(如jQuery)假设您不修改
Object.prototype