JavaScript:扩充对象/函数原型,避免名称冲突

时间:2013-02-03 13:01:51

标签: javascript prototype conflict

每个人都过得愉快,

有没有一种方法可以增加javascript对象和函数元素来避免冲突问题?让我更具体一点:

假设我有2个.js文件:

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

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

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

我的问题:

有没有办法将扩充的影响限制在他的文件上下文中,或更好地限制到模块上下文?

编辑:

实际上,我正在阅读crockford的书JavaScript:好的部分,他使用对象和函数的原型扩充作为正常的事情,而不谈论冲突问题。这很奇怪,因为这本书倾向于不污染全局命名空间。所以我认为必须有某种解决方法。

1 个答案:

答案 0 :(得分: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等库。