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

时间:2009-07-16 13:04:40

标签: javascript

扩展内置JavaScript对象(如String,Array,Date,Boolean,Math等)最有用,最实用的方法是什么?

字符串

阵列

日期

注意:请为每个答案发布一个扩展方法。

21 个答案:

答案 0 :(得分:40)

字符串全部替换:

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

答案 1 :(得分:38)

这是String.replaceAll()方法

的另一种实现方式
String.prototype.replaceAll = function(search, replace) {
    if (replace === undefined) {
        return this.toString();
    }
    return this.split(search).join(replace);
}

这个和解决方案here之间的区别在于此实现正确处理字符串中的regexp特殊字符以及允许字匹配

答案 2 :(得分: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

答案 3 :(得分:8)

James Padolsey

中有大量的String.prototype函数

https://github.com/padolsey/string.prototype

这些包括:

  • camelize
  • 包含
  • 计数
  • 提取
  • 的forEach
  • forEachWord
  • linkify
  • 许多
  • 随机化
  • 除去
  • 逆转
  • 缩短
  • 排序
  • toDOM
  • 修剪
  • 涡卷

答案 4 :(得分: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

答案 5 :(得分: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();
}

答案 6 :(得分: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  '

答案 7 :(得分:3)

来自Prototype库的

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);
  }
}

答案 8 :(得分:3)

PHP.JS是将PHP的大多数函数移植到JavaScript的非常好的工作。他们目前有一个非常令人印象深刻的名单:

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

答案 9 :(得分: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方法无法返回真正的数组使得很多这样的方法变得毫无用处。如果你正在使用某种类型的Lib,他们通常会定义这样的方法(map,filter,exists等)。

答案 10 :(得分:1)

这是Date对象的一个​​很好的扩展,它允许你非常容易地格式化日期。它使用PHP的日期语法,因此熟悉PHP的人会立即得到它。其他人也有很多可能的开关列表。就个人而言,我还没有找到更简单的方法来将日期格式化为各种格式。

Date Format

答案 11 :(得分:1)

这两个是用于插入和删除数组中特定位置的元素的包装器,因为我不喜欢名称splice

// insert element at index
Array.prototype.insertAt = function(element, index) {
    this.splice(index, 0, element);
}

// delete element from index
Array.prototype.removeAt = function(index) {
    this.splice(index, 1);
}

一些更有用的数组方法可以避免使用索引:

Array.prototype.first = function() {
    return this[0] || undefined;
};

Array.prototype.last = function() {
    if(this.length > 0) {
        return this[this.length - 1];
    }
    return undefined;
};

Array.prototype.max = function(array){
    return Math.max.apply(Math, array);
};

Array.prototype.min = function(array){
    return Math.min.apply(Math, array);
};

MooTools库中的一些有用功能:

<强> Function.delay

用于在经过给定的毫秒后执行函数。

// alerts "hello" after 2 seconds.
(function() {
    alert("hello");
}).delay(2000);    ​

<强> Number.times

类似于Ruby的数字时间方法,它接受一个函数并执行N次,其中N是数字值。

// logs hello 5 times
(5).times(function() {
    console.log("hello");
});

答案 12 :(得分:1)

我使用了Scott Koon概述的Array.Map函数几次。

http://www.lazycoder.com/weblog/2009/08/12/a-simple-map-function-for-plain-javascript-arrays/

Array.prototype.map = function(fn) {
    var r = [];
    var l = this.length;
    for(i=0;i<l;i++)
    {
        r.push(fn(this[i]));
    }
    return r; 
};

答案 13 :(得分:1)

我可以在这里找到我经常使用的一系列功能:

http://svn.asplib.org/asplib1.2/core/string.asp

http://docs.hyperweb.no/objects/String/

答案 14 :(得分:1)

数组包含:

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

用法:

var arr = [1, 2, 3];
alert(arr.contains(2));

这个小帮助函数会告诉您数组是否包含对象。如果是,则返回对象的索引,否则返回-1。

免费周五下午提示:永远不要修改对象原型。这只是要求整个世界的痛苦 - 我学到了很多东西:)

答案 15 :(得分:1)

<强> Date.toMidnight

Date.prototype.toMidnight = function(){ 
  this.setMinutes(0); 
  this.setSeconds(0); 
  this.setHours(0) 
}

答案 16 :(得分:0)

使用这样的原型链:

String.prototype.AddWorld = function() { return this+'World' }

"Hello ".AddWorld(); // returns the string "Hello World"

答案 17 :(得分:0)

// This replaces all instances of 'from' to 'to' even when
// 'from' and 'to' are similar (i.e .replaceAll('a', 'a '))
String.prototype.replaceAll = function(from, to) {
    var k = this;
    var i = 0;
    var j = from.length;
    var l = to.length;

    while (i <= k.length)
        if (k.substring(i, i + j) == from) {
        k = k.substring(0, i) + k.substring(i).replace(from, to);
        i += l;
    }
    else
        i++;

    return k;
};

答案 18 :(得分:0)

http://maiaco.com/articles/js/missingArrayFunctions.php上有一篇很好的文章描述了六个有用的函数,可以添加到Array原型中。函数是linearSearch(与另一个答案中给出的indexOf相同),binarySearch,retainAll,removeAll,unique和addAll。本文还包括六个函数中每个函数的JavaScript代码和示例如何使用它们的示例代码。

答案 19 :(得分:0)

这是一个用于大写字符串的原型函数:

String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

答案 20 :(得分:0)

使用underscore.js库或Angular使用lodash库。