◆ Array.prototype.method = function(){}
◆ Array.prototype.__proto__ = {method: function(){}} 

普段プロトタイプを拡張してメソッドを増やす時は
Array.prototype.method = function(){}

という風にしています
よくある方法です


これの欠点は 既存メソッドと混ざって自分で作ったのだけの一覧が見づらいところ
あと 同名メソッドがあった場合に完全に上書きしてしまうところ です


最近どうかなと思った方法は
Array.prototype.__proto__ = {method : function(){}}
という風に一段階プロトタイプチェーンを伸ばして自分のメソッド用のオブジェクトを設置する方法

メリットは自分で作ったメソッドをまとめれるところ
あとオブジェクトを作るので ES6 のメソッド記法で見やすく書けます
Array.prototype.__proto__ = {
    intersect(arr){
        var set = new Set(this)
        return arr.filter(set.has.bind(set))
    },
    union(arr){
        var set = new Set(this)
        arr.forEach(set.add.bind(set))
        return [...set]
    }
}
console.log([1,2,3,5,6].intersect([2,4,6]))
// [2, 6]
console.log([1,2,5].union([2,3,4]))
// [1, 2, 5, 3, 4]

またチェーンの優先順は native のメソッド → 自分のメソッドなので 同名メソッドができれば native のほうが使われます

一見便利そうですが 役に立つのは ES next を見ておき 次にこの名前でこういう動きのメソッドが来るとわかっていて polyfill 実装をしていた場合くらいです

引数や返り値が違えばエラーになるだけですし ブラウザの実装状況で ユーザの環境によって動いたり動かなかったり というのは避けるべきなので 自分定義の関数を想定してるなら同名の native メソッドができても自作の方を使うべきです

そう考えるとこれまで通りが一番 にも思えるのですが 自作メソッドが綺麗に分かれるというのは捨てがたい というところです

んー でも作るときだけの都合で実行時には全く役立たないことだから ムダにチェーン伸ばすのはパフォーマンスに関わるし直接書くのがいいのかなぁ……