为其他浏览器添加功能以利用未实现的方法

时间:2017-12-14 20:47:06

标签: javascript oop

我想添加一些在所有浏览器中都不可用的特定对象,属性和方法(我只专门针对E11和Edge)。具体来说,我正在尝试添加Object.assign()URL.searchParams.get()。我肯定会放弃尝试使用这些方法,并且恰好使用我自己的替代方法,这些方法可以在所有浏览器上使用,或者更好地使用polyfill,但这不是我的目标。请用它来提升我的知识(或者也许是强迫症)。

我的尝试如下。 Object.assign()似乎已经足够好了,我甚至让URL.searchParams.get()使用IE11。

我的困难在于Edge和URL.searchParams.get()。部分支持URL所以我不想像IE11那样覆盖整个事情,但只想添加最终的searchParams.get()部分。如何检测是否支持此方法?

//Crutches for IE and Edge
if(typeof Object.assign !== 'function'){  //IE only
    Object.assign=function(target,source1){
        return [target,source1].reduce(function (r, o) {
            Object.keys(o).forEach(function (k) {
                r[k] = o[k];
            });
            return r;
            }, {});
    }
}

function _get(param) {
    if (!this.params) {
        var params = {};
        var search = decodeURIComponent(window.location.href.slice(window.location.href.indexOf('?') + 1));
        var definitions = search.split('&');
        definitions.forEach(function (val, key) {
            var parts = val.split('=', 2);
            params[parts[0]] = parts[1];
        });
        this.params = params;
    }
    return this.params[param] ? this.params[param] : null;
}
if (typeof URL !== 'function') { //IE only
    URL = function (href) {
        this.href = href;
    }
    URL.prototype.searchParams = {get: _get}
}

if (typeof URL.searchParams !== 'function') { //Edge
//How do I deal with this for Edge as URL is a function ,and URL.searchParams will not even be set for modern browsers
}

console.log(Object.assign({a:'a',b:'b',c:'c'},{a:'A',b:'B',a:'D'}))

var url = new URL(window.location.href);
console.log('pg', url.searchParams.get('pg'));

0 个答案:

没有答案