2016-08-05 17 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

永遠Monkeypatchers戦争を開始するためにその実施をモンキーパッチprebinded機能

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

、あるいはを渡すことを確認することができます「どのようにしてこのような紛争を防ぐことができますか?これらの人にネイティブ関数のオーバーライドを止めるよう伝えてください。 –

+2

Mapは配列クラスのネイティブメソッドです。これをオーバーライドすると競合が発生しますArrayクラスのメソッドを追加するには別の名前を使用してください –

+0

@YeldarKurmangaliyev私は知っていますが、クライアントであるので、 ) – TheNone

答えて

1

唯一の唯一の証明の解決策は、ネイティブオブジェクトのプロトタイプをmonkeypatchしないように頼むことです。あるいは、古いブラウザーで元のメソッドをポリファイル化する場合は、少なくともそれを仕様に準じた方法で行います。

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

    }; 
} 

一部の契約上の義務のため、これはオプションではない場合。次のオプションがあります。

モンキーパッチされたメソッドのネイティブバージョンを保存することができます。彼らは「のみ」彼らのマップの実装でthisArgを逃した場合

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

// usage 
safeMap(myArray, callback, thisArg) 

あなたは常に

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); 
    } 
}