2016-08-05 56 views
0

我使用的原型在我的項目:的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。我怎樣才能防止這種衝突?

這種衝突只發生在本地。在生產中不存在任何衝突問題。

+5

「我怎麼能防止這種衝突?」告訴這些人停止覆蓋原生功能。 –

+2

Map是數組類中的本地方法..覆蓋這將導致衝突..使用一些不同的名稱來添加Array類中的方法 –

+0

@YeldarKurmangaliyev我知道,但作爲客戶端,我們不能說他們這樣的事情: ) – TheNone

回答

1

唯一的防彈解決方案是要求他們不要monkeypatch本地對象的原型。或者至少按照規範一致的方式來做,如果他們在老版本的瀏覽器中使用原生方法進行填充。

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

    }; 
} 

如果由於某些合同義務,這不是一個選項。您有以下選擇:

您可以在執行之前保存monkeypatched方法的本地版本。

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

// usage 
safeMap(myArray, callback, thisArg) 

如果他們「只」在他們的地圖實現錯過thisArg你可以確保你總是傳遞prebinded功能

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

甚至猴補丁的實現開始永恆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); 
    } 
}