有哪些有用的JavaScript方法可以扩展内置对象?

41

类似问题:https://dev59.com/FUjSa4cB1Zd3GeqPFG3D - TJ L
21个回答

41

字符串替换全部:

String.prototype.replaceAll = function(search, replace)
{
    //if replace is not sent, return original string otherwise it will
    //replace search string with 'undefined'.
    if (replace === undefined) {
        return this.toString();
    }

    return this.replace(new RegExp('[' + search + ']', 'g'), replace);
};

var str = 'ABCADRAE';
alert(str.replaceAll('A','X')); // output : XBCXDRXE

3
另一个改进:如果您添加任何正则表达式特殊字符,可能会得到意外的结果。例如,如果您将“.”作为搜索字符串传递,将替换所有字符。为避免这种情况,请将您的正则表达式更改为类似于new RegExp('['+ search']')的形式。 - RaYell
1
这是一个很好的发现,伙计。你应该开始编辑这些帖子! :) - SolutionYogi
2
@RaYell - 如果你想一次替换多个字符,例如 'foobar'.replaceAll('foo'),那么这种方法是行不通的。我认为最好明确指出正则表达式可以作为第一个参数。 - harto
1
如果你用那个方法替换单词,可能无法正常工作。也许更好的解决方案是检查搜索参数的类型。如果它是字符串,那么你可以转义所有特殊字符;如果它是正则表达式(typeof 是对象),那么你可以直接使用它。 - RaYell
这似乎在某些情况下存在漏洞...可能是由于将内容解析为正则表达式而导致的。 - user2286243
显示剩余7条评论

38

这是另一种实现 String.replaceAll() 方法的方式

String.prototype.replaceAll = function(search, replace) {
    if (replace === undefined) {
        return this.toString();
    }
    return this.split(search).join(replace);
}
这个实现与这里发布的解决方案的区别在于,它正确处理字符串中的正则表达式特殊字符,并允许单词匹配。

为什么需要使用 .toString?如果 replace 未定义,则将原始对象分配回自身。例如:string test = "hello"; test = test.replace("hello"); - SolutionYogi
1
如果我删除toString()并运行此代码,将会得到一个对象而不是字符串。尝试在返回的值上使用typeof(已在FF和Firebug中测试,不知道其他浏览器是否以不同的方式处理)。 - RaYell

16
Array.prototype.indexOf = Array.prototype.indexOf || function (item) {
    for (var i=0; i < this.length; i++) {
        if(this[i] === item) return i;
    }
    return -1;
};

使用方法:

var list = ["my", "array", "contents"];
alert(list.indexOf("contents"));     // outputs 2

4
大多数浏览器都实现了这种方法,因此您可以在覆盖可能已经完成的内容之前添加一个存在性检查。在我看来,您应该将此代码包装在 if (Array.prototype.indexOf === undefined) {...} 中。 - RaYell
1
RaYell更新了代码,如果indexOf已经存在,则不重新定义它。 - SolutionYogi

9

1
@P6345uk 有点晚了,但链接已修复。 - Octavia Togami

8

String.format

String.prototype.format = function (values) {

    var regex = /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g;

    var getValue = function (key) {
            if (values == null || typeof values === 'undefined') return null;

            var value = values[key];
            var type = typeof value;

            return type === 'string' || type === 'number' ? value : null;
        };

    return this.replace(regex, function (match) {
        //match will look like {sample-match}
        //key will be 'sample-match';
        var key = match.substr(1, match.length - 2);

        var value = getValue(key);

        return value != null ? value : match;
    });
};

使用方法:

alert('Program: {key1} {key2}'.format({ 'key1' : 'Hello', 'key2' : 'World' })); //alerts Program: hello world

这是一个不错的建议。如果能扩展到模仿C#中的功能,就会非常酷了,可以为日期/数字/对象指定上下文相关的格式,例如String.Format("{0:d}", val)。 - Darko
我认为微软的ASP.NET Ajax库有一个string.Format方法,它模仿了C#的string.Format方法。 - SolutionYogi
你是对的Nosredna,已经修复了这篇文章。 - SolutionYogi

7
// left trim
String.prototype.ltrim = function () {
    return this.replace(/^\s+/, '');
}

// right trim
String.prototype.rtrim = function () {
    return this.replace(/\s+$/, '');
}

// left and right trim
String.prototype.trim = function () {
    return this.ltrim().rtrim();
}

5

字符串填充:

String.prototype.padLeft = function (length, character) { 
     return new Array(length - this.length + 1).join(character || ' ') + this; 
}
'trial'.padLeft(7, 'X'); // output : 'XXtrial'
'trial'.padLeft(7);      // output : '  trial'



String.prototype.padRight = function (length, character) { 
     return this + new Array(length - this.length + 1).join(character || ' '); 
}
'trial'.padRight(7, 'X'); // output : 'trialXX'
'trial'.padRight(7);      // output : 'trial  '

3

Function.prototype.bind是原型库中的一个方法。

callapply类似,但允许您返回对函数的引用,在特定上下文中调用它而不立即执行它。还允许你柯里化参数。它非常有用,以至于它成为ECMAScript 5的一部分,并已在浏览器中本地实现。

Function.prototype.bind = function() {
  var __method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
  return function() {
    var local_args = args.concat(Array.prototype.slice.call(arguments));
    if (this !== window) local_args.push(this);
    return __method.apply(object, local_args);
  }
}

3

PHP.JS是将PHP大部分函数移植到JavaScript的非常好的尝试。他们目前拥有一个非常令人印象深刻的列表:

在线地址:http://phpjs.org/functions/index


2

各种列表操作的原型总是很棒。由于每个帖子只需要一个,我将仅发布foldl,我通过SML发现它(它从左到右“折叠”列表,在foldr中有一个相对应的版本)。

Array.prototype.foldl = function(fnc,start) {
    var a = start;
    for (var i = 0; i < this.length; i++) {
        a = fnc(this[i],a);
    }
    return a;
}

一些简单的例子可能包括:
var l = ["hello" , "world"];
l.foldl(function(i, acc) { return acc+" "+i; }, "") // => returns "hello world"

遗憾的是,标准DOM方法未能返回真正的数组,这使得许多这样的方法变得相当无用。如果您正在使用某种库,则它们通常已经定义了这些方法(map、filter、exists等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接