prototype はわけるべき?混ぜるべき?
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ Array.prototype.method = function(){}
◆ Array.prototype.__proto__ = {method: function(){}}
◆ Array.prototype.__proto__ = {method: function(){}}
普段プロトタイプを拡張してメソッドを増やす時は
という風にしています
よくある方法です
これの欠点は 既存メソッドと混ざって自分で作ったのだけの一覧が見づらいところ
あと 同名メソッドがあった場合に完全に上書きしてしまうところ です
最近どうかなと思った方法は
メリットは自分で作ったメソッドをまとめれるところ
あとオブジェクトを作るので ES6 のメソッド記法で見やすく書けます
またチェーンの優先順は native のメソッド → 自分のメソッドなので 同名メソッドができれば native のほうが使われます
一見便利そうですが 役に立つのは ES next を見ておき 次にこの名前でこういう動きのメソッドが来るとわかっていて polyfill 実装をしていた場合くらいです
引数や返り値が違えばエラーになるだけですし ブラウザの実装状況で ユーザの環境によって動いたり動かなかったり というのは避けるべきなので 自分定義の関数を想定してるなら同名の native メソッドができても自作の方を使うべきです
そう考えるとこれまで通りが一番 にも思えるのですが 自作メソッドが綺麗に分かれるというのは捨てがたい というところです
んー でも作るときだけの都合で実行時には全く役立たないことだから ムダにチェーン伸ばすのはパフォーマンスに関わるし直接書くのがいいのかなぁ……
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]
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 メソッドができても自作の方を使うべきです
そう考えるとこれまで通りが一番 にも思えるのですが 自作メソッドが綺麗に分かれるというのは捨てがたい というところです
んー でも作るときだけの都合で実行時には全く役立たないことだから ムダにチェーン伸ばすのはパフォーマンスに関わるし直接書くのがいいのかなぁ……