JavaScript原生对象的api有些情况下使用并不方便,考虑扩展基于Object、Function、String、Array扩展,参考了prototype.js的部分实现,做了提取和修改,分享下:

/**
*
* @authors yinshen (shenyin19861216@163.com)
* @date 2013-09-05 23:23:25
* @version $Id$
*/
//Object 扩展
(function() {
var FUNCTION_CLASS = '[object Function]',
BOOLEAN_CLASS = '[object Boolean]',
NUMBER_CLASS = '[object Number]',
STRING_CLASS = '[object String]',
ARRAY_CLASS = '[object Array]',
OBJECT_CLASS = '[object Object]',
DATE_CLASS = '[object Date]'; function extend(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
} function clone(o,deep) {
if (deep === true) {
var target = {};
for (var property in o) {
if (o.hasOwnProperty(property)) {
if (Object.isObject(o[property])) {
target[property] = Object.clone(o[property],true);
} else {
target[property] = o[property];
}
}
}
return target;
} else {
return extend({}, o);
}
} function isElement(object) {
return !!(this && object.nodeType == 1);
} function isObject(object) {
return Object.prototype.toString.call(object) === OBJECT_CLASS;
} function isArray(object) {
return Object.prototype.toString.call(object) === ARRAY_CLASS;
} function isFunction(object) {
return Object.prototype.toString.call(object) === FUNCTION_CLASS;
} function isString(object) {
return Object.prototype.toString.call(object) === STRING_CLASS;
} function isNumber(object) {
return Object.prototype.toString.call(object) === NUMBER_CLASS;
} function isDate(object) {
return Object.prototype.toString.call(object) === DATE_CLASS;
} function isUndefined(object) {
return typeof object === "undefined";
} function param(object) {
var arr = [];
for (var prop in object) {
if (object.hasOwnProperty(prop)) {
arr.push([encodeURIComponent(prop), "=", encodeURIComponent(object[prop]), "&"].join(""));
}
}
return arr.join("").slice(0, -1);
} function each(object,fn) {
if(typeof fn ==="undefined"){return;}
for (var prop in object) {
if (object.hasOwnProperty(prop)) {
if (fn(object[prop], prop) === false) {
break;
}
}
}
}
extend(Object, {
//extend(Object.prototype, {
extend: extend,
clone: clone,
isObject: isObject,
isElement: isElement,
isArray: isArray,
isFunction: isFunction,
isString: isString,
isNumber: isNumber,
isDate: isDate,
isUndefined: isUndefined,
param: param,
each: each
}); })(); //String 扩展
Object.extend(String.prototype, (function() {
//字符串替换,支持{}和[]
function format(o) {
return this.replace(/\{(\w+)\}/g, function($1, $2) {
return o[$2] !== undefined ? o[$2] : $1;
});
}; //获取字符串长度,区分中文占2个字符
function len() {
return this.replace(/[^\x00-\xff]/g, '**').length;
} function truncate(length, truncation) {
length = length || 30;
truncation = Object.isUndefined(truncation) ? '...' : truncation;
return this.length > length ?
this.slice(0, length - truncation.length) + truncation : String(this);
} function trim(isLeft) {
if (isLeft === true) {
return this.replace(/^\s+/, '');
} else if (isLeft === false) {
return this.replace(/\s+$/, '');
}
return this.replace(/^\s+/, '').replace(/\s+$/, '');
} var htmlDiv=document.createElement("div");
function html(escape) {
/* var replace = ["'", "'", '"', "&quot;", " ", "&nbsp;", ">", "&gt;", "<", "&lt;", "&", "&amp;", ];
escape === false && replace.reverse();
for (var i = 0, str = this; i < replace.length; i += 2) {
str = str.replace(new RegExp(replace[i], 'g'), replace[i + 1]);
}
return str;*/
function encode(){
htmlDiv.innerHTML="";
return htmlDiv.appendChild(document.createTextNode(this)).parentNode.innerHTML.replace(/\s/g, "&nbsp;");
} function decode(){
htmlDiv.innerHTML=this;
return htmlDiv.innerText;
}
var str=this;
return escape===false?decode.apply(str):encode.apply(str);
} function has(pattern) {
return this.indexOf(pattern) > -1;
} function startsWith(pattern) {
return this.lastIndexOf(pattern, 0) === 0;
} function endsWith(pattern) {
var d = this.length - pattern.length;
return d >= 0 && this.indexOf(pattern, d) === d;
} function empty() {
return this == '';
} function text() {
return this.replace(/<\/?[^>]*\/?>/g, '');
} function blank() {
return /^\s*$/.test(this);
} function sprintf(){
var
i,
result = this,
param,
reg,
length = arguments.length;
if (length < 1){
return text;
} i = 0;
while(i < length){
result = result.replace(/%s/, '{#' + (i++) + '#}');
}
result.replace('%s', ''); i = 0;
while( (param = arguments[i])!==undefined ){ // 0 也是可能的替换数字
reg = new RegExp('{#' + i + '#}', 'g')
result = result.replace(reg, param);
i++;
}
return result;
} function bytes() {
var str = this,
i = 0,
_char,
l = 0;
while(_char = str.charAt(i++)){
l += (_char).charCodeAt().toString(16).length / 2;
}
return l;
} return {
format: format,
sprintf:sprintf,
text: text,
len: len,
truncate: truncate,
trim: String.prototype.trim || trim,
html: html, //"&<>".html()==="&amp;&lt;&gt;" "&amp;&lt;&gt;".html(false)==="&<>"
has: has,
startsWith: startsWith,
endsWith: endsWith,
empty: empty, //内容为空,连空格都没 " ".empty()===false
blank: blank, //没有任何有意义的字符,空格不算 " ".blank()===true
bytes : bytes //计算一个字符串的字节长度
};
})()); //Function 扩展
Object.extend(Function.prototype, (function() {
var slice = Array.prototype.slice; function update(array, args) {
var arrayLength = array.length,
length = args.length;
while (length--) array[arrayLength + length] = args[length];
return array;
} function merge(array, args) {
array = slice.call(array, 0);
return update(array, args);
} function bind(context) {
if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
var __method = this,
args = slice.call(arguments, 1);
return function() {
var a = merge(args, arguments);
return __method.apply(context, a);
}
} /*
这东西炫耀的价值大于实用,还是不引入了
function curry() {
if (!arguments.length) return this;
var __method = this, args = slice.call(arguments, 0);
return function() {
var a = merge(args, arguments);
return __method.apply(this, a);
}
} function uncurry(){
var __method=this;
return function(){
Function.prototype.call.apply(__method,arguments);
}
}*/ function delay(timeout) {
var __method = this,
args = slice.call(arguments, 1);
timeout = timeout * 1000;
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
} function defer() {
var args = update([0.01], arguments);
return this.delay.apply(this, args);
} function before(fn) {
var __method = this;
return function() {
if (fn.apply(this, arguments) === false) {
return false;
}
return __method.apply(this, arguments);
}
} function after(fn) {
var __method = this;
return function() {
var ret = __method.apply(this, arguments);
var args = update([ret], arguments);
fn.apply(this, args);
return ret;
}
} function wrap(wrapper) {
var __method = this;
return function() {
var a = update([__method.bind(this)], arguments);
return wrapper.apply(this, a);
}
} return {
bind: bind,
delay: delay,
defer: defer,
before: before,
after: after,
wrap: wrap
}
})()); //Array扩展
(function() {
var arrayProto = Array.prototype,
slice = arrayProto.slice; function each(iterator, context) {
for (var i = 0, length = this.length >>> 0; i < length; i++) {
if (i in this) iterator.call(context, this[i], i, this);
}
} function last() {
return this[this.length - 1];
} function clone(deep) {
if (deep === true) {
return Object.clone.apply(this, arguments);
}
return slice.call(this, 0);
} function map(fn) {
var arr = [];
this.each(function(v, k) {
arr.push( fn(v, k) );
});
return arr;
} Object.extend(arrayProto, {
each: Array.prototype.forEach || each,
last: last,
clone: clone,
map: map
});
})();

Object、Function、String、Array原生对象扩展方法的更多相关文章

  1. jQuery对象扩展方法(Extend)深度解析

    1.这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQuery3.2.1版本对象扩展方法的源码: ...

  2. 给 string 添加一个 GetInputStream 扩展方法

    有时候,我们须要读取一些数据,而无论这数据来源于磁盘上的数据文件,还是来源于网络上的数据.于是.就有了以下的 StringExtensions.cs: using System; using Syst ...

  3. 为Jquery类和Jquery对象扩展方法

    转:https://www.cnblogs.com/keyi/p/6089901.html jQuery为开发插件提拱了两个方法,分别是: JavaScript代码 jQuery.fn.extend( ...

  4. JavaScript Array 对象扩展方法

    /** 删除数组中指定索引的数据 **/ Array.prototype.deleteAt = function (index) { if (index < 0) { return this; ...

  5. JavaScript String 对象扩展方法

    /** 在字符串末尾追加字符串 **/ String.prototype.append = function (str) { return this.concat(str); } /** 删除指定索引 ...

  6. 转译es6原生原生对象及方法,如Object.assign,Object.keys等,及promise

    下面主要为兼容恶心的ie 1,首先引入‘babel-polyfill’,可写在webpack.dev.js的entry.vendors数组里面 2,在入口文件如app.js里面import 'babe ...

  7. js Array数组对象常见方法总结

    Array对象一般用来存储数据. 其常用的方法包括: 1.concat()方法 concat() 方法用于合并两个或多个数组.它不会更改现有数组,而是返回一个新数组. 例如: var arr1=[1, ...

  8. 常用的js对象扩展方法

    1. 字符串的replaceAll String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!R ...

  9. jquery扩展方法

    jquery插件的开发包括两种:一种是类级别的插件开发,即给jquery添加新的全局函数,相当于给jquery类本身添加方法. jquery的全局函数就是属于jquery命名空间的函数,另一种是对象级 ...

随机推荐

  1. [CareerCup] 7.2 Ants on Polygon 多边形上的蚂蚁

    7.2 There are three ants on different vertices of a triangle. What is the probability of collision ( ...

  2. 20145222黄亚奇《Java程序设计》第9周学习总结

    20145222第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...

  3. VS2010下配置使用OpenGL的glut库

    我已在我机上测试成功,机装VS2010! 在win7(windows7 ultimate SP1)下成功安装VS2010(Visual Studio 2010 ultimate x86). 下载glu ...

  4. 高校手机签到系统——第一部分Authority权限系统(下)

    很抱歉,之前寝室光纤断了,所以到现在才更新这个系列的第二篇博客.点击访问高校手机签到系统——第一部分Authority权限系统(上) 这几天我反思了一下上一篇写博上的方式,一味的贴代码式的,是否应该更 ...

  5. node 学习笔记 - fs 文件操作

    本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...

  6. 趋势or过渡,量子点屏幕真的优于OLED?

    [导读]谁都知道买电视就是要买看起来很爽的产品,但怎么界定这个“爽”字?大部分人所知的是屏幕要够大,再近一步就是分辨率要够高——在这个4K分辨率逐步进入寻常家庭的时代,这两者已经不是选购屏幕类产品的大 ...

  7. ios9+xcode7 适配笔记

    升级了xcode7,最近ios9上马,又到了草泥马的时间,apple开放团队每次系统更新,都是无数个草泥马的适配夜晚,现在ios9上线以前的app竟然启动crash,这是要闹哪样. 1.微信和微博的s ...

  8. [BZOJ 3143][HNOI2013]游走(数学期望)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3143 分析: 易得如果知道了每条边经过的数学期望,那就可以贪心着按每条边的期望的大小赋 ...

  9. AngularJs-指令和指令之间的交互(动感超人)

    前言: 上节我们学习到了指令和控制器之间的交互,通过给指令添加动作,调用了控制器中的方法.本节我们学习指令和指令之间是如何交互的,我们通过一个小游戏来和大家一起学习,听大漠老师说这是国外的人写的dem ...

  10. ios------进度轮

    UIActivityIndicatorView实例提供轻型视图,这些视图显示一个标准的旋转进度轮.当使用这些视图时,最重要的一个关键词是小.20×20像素是大多数指示器样式获得最清楚显示效果的大小.只 ...