两个文件中的Javascript冲突

时间:2016-08-05 06:15:50

标签: javascript

我在项目中使用原型:

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
    var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
    return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
  }, this));
};

我们必须将我们的客户端javascript文件添加到我们的项目中。他们有这样的代码:

Array.prototype.map = function(fnc) {
 //code block
}

在我们的代码中映射,返回Array.prototype.map。我怎么能防止这种冲突?

此冲突仅在本地发生。在生产中没有任何冲突问题。

1 个答案:

答案 0 :(得分:1)

唯一的防弹解决方案是让他们不要将原生对象的原型单片化。或者至少以符合规范的方式进行,如果他们这样做是为了在旧浏览器中填充本机方法。

if(typeof Array.prototype.map !== 'function') {
   Array.prototype.map = function mapPolyfil() {

   };
}

如果由于某些合同义务,这不是一种选择。您有以下选择:

您可以在它们执行之前保存monkeypatched方法的本机版本。

 var safeMap = Function.bind.call([].map);

// usage
safeMap(myArray, callback, thisArg)

如果他们在地图实施中“仅”错过thisArg,您可以确保始终通过预先绑定的功能

array.map(function(){}.bind(this))

甚至monkeypatch他们的实施开始永恒的Monkeypatchers战争

if(Array.prototype.map.length === 1) { //was patched
    var theirMap = Array.prototype.map;
    Array.prototype.map = function(fn, thisArg) {
       if(arguments.length === 2) {
          fn = fn.bind(thisArg)
       }

       return theirMap.call(this, fn);
    }
}