URLSearchParamsを自作してみた

JavaScript

Chromeやスマホのブラウザではまだ実装されてないみたいなので自作してみた。

if (!window.URLSearchParams) {
    (function(){
        var URLSearchParams = function(search) {
            this.params = [];

            if (search instanceof URLSearchParams) {
                this.params = search.params;
                return;
            }

            var pairs = search.split("&");
            var len = pairs.length;
            for (var i = 0; i < len; i++) {
                var pair = pairs[i].split("=");
                pair.push(null);
                this.append(pair[0], pair[1]);
            }
        };

        var p = URLSearchParams.prototype;

        function search(name) {
            this.params.forEach(function(element, index) {
                if (element.name === name) return index;
            });
            return false;
        }

        p.append = function(name, value) {
            this.params.push({
                name: name,
                value: value,
            });
        };

        p.delete = function(name) {
            while (true) {
                var index = search.call(this, name);
                if (index === false) {
                    break;
                }

                this.params.splice(index, 1);
            }
        };

        p.get = function(name) {
            var index = search.call(this, name);
            return this.params[index].name;
        };

        p.set = function(name, value) {
            var index = search.call(this, name);
            if (index === false) {
                this.append(name, value);
            } else {
                this.params[index] = {
                    name: name,
                    value: value,
                };
            } 
        };

        p.getAll = function() {
            var values = [];

            this.params.forEach(function(element) {
                values.push(element.value);
            });

            return values;
        };

        p.has = function(name) {
            return search.call(this, name) !== false;
        };

        p.toString = function() {
            var pairs = [];

            this.params.forEach(function(element) {
                pairs.push(element.name + '=' + element.value);
            });

            return pairs.join('&');
        };

        window.URLSearchParams = URLSearchParams;
    })();
}

Firefoxでの動作を参考に実装。だいたい合ってると思ふ。。。
間違いとかあったら教えて下さいな。

本当はURLと連動させたかったけど、searchプロパティがconfigurable:falseだったので断念しました。

2016/05/02 修正

コンストラクタのsearchに?から始まる正規表現パターンを検索していたのは間違いだったようなので削除。

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

たかおファン(surface0)をフォローする
たかおファン(surface0)をフォローする
Rain or Shine

コメント

タイトルとURLをコピーしました