javascript String2
来源:互联网 发布:移动网络维修电话 编辑:程序博客网 时间:2024/06/06 13:04
javascript中有一种方法叫做泛化方法,指那种原生对象不可遍历的原型方法。如Array的pop,slice等。我们必须知道它们的名字才能调用它或者把它挖出来。假如我们想设计一个类,拥有与String同样的功能,我们就有这需要。不如放开点说,为什么要设计这个类吧,显然String2的效率不如原生的,但事情总要往两面看。正如C#不如二进制的机器码,但人性化方面C#则远胜过后者。那么难道String不够人性化吗?很难回答这问题,但如果我们要对它进行一些特殊的操作,如camelize,capitalize或者trim等操作时,我们就需要相应的高级方法。通常人们第一个是想到往原型中添加。但对原生对象的原型添加扩展是不好的习惯,因为这方面的工作Prototype与mootools已为你做了。如果你导入这些库或者有一天你忘了,没有看API,在原型复写了这些方法,这引起的连锁反应与灾难是难以想象也很难查究。这正是jQuery聪明的地方。jQuery刚诞生时,市场基本被Prototype占领了,现在Prototype在外国还是主流的js框架,许多遗留系统都用它来写前端。如果jQuery还是走它们的老路,到处污染(扩展)原生对象,这会给开发人员带来难题,用得了jQuery就不能用Prototype或mootools,或者相反。在Prototype如此成熟的框架面前,jQuery只有死路一条。jQuery于是把什么功能都绑定在jQuery这个函数上,连$也是可置换的。这情形与java的Spring差不多。不过jQuery的缺陷很明显,继承体系很薄弱,所有能力都用于处理DOM。如果处理String,它就不能像以往一样链式操作了。
for(var i in Array){ alert(i + " : "+ Array[i])}for(var i in Array.prototype){ alert(i + " : "+ Array.prototype[i])}如果我们不想在String的原型添加新方法,又想链式操作(即在返回的是字符串时),这基本没有可能。原型方法最大特点,围绕this进行操作。如果this的类型又是string,number,真是无从入手。看了几天Base2的代码,最后以失败告终。不过原作者还是没有实现字符串的链式操作。最后的办法是自己创建一个空对象,把String的原型方法与自己想添加的方法都添加到此对象的原型上。
var big = String.prototype["big"];var e = "this"var a = big.call(e);alert(a)挖出String的原型方法为我们工作。
var concat = String.prototype["concat"];var e = "this"var a = concat.apply(e,["dddd","eeee"]);alert(a)但前面说过,原型方法都是围绕this工作,而我们那个东西是对象,我们要处理字符串怎样办?把它弄成我们做对象的属性,我称之为core,这样它就随this进行原型的世界。在原型里面,其实有两套系统的。第一层是与String原型方法的同名方法,它们只是一个外壳,把String的原型方法包裹其中,接着把this.core的东西取出来,它是真正的字符串。这里有String的方法对它进行操作,如果返回的是字符串,把又把它包裹成String2,这是实现链式操作的关键。最后当然要重写一下valueOf与toString方法了。
var _slice = Array.prototype.slice; var String2 = function(){ this.core = arguments[0]; return this; }; String2.prototype = { constructor:String2, toString:function(){ return this.core; }, valueOf:function(){ return this.core; } }; var generics = "charAt,charCodeAt,concat,indexOf,lastIndexOf,match,\ replace,search,slice,split,substr,substring,toLowerCase,toUpperCase,fontcolor,\ big,small,anchor,link,bold,italics,sub,sup,fixed,fromCharCode,strike"; function each(array, block, context) { var i = 0,length = array.length; for (;i < length; i++) block.call(context, array[i], i, array); }; function array(iterable){ try{ return _slice.call(iterable,0); }catch(e){ var n = iterable.length || 0, array = new Array(n), i =0; for(;i<n;i++) array[n] = iterable[n]; return array; } }; each(generics.match(/\w+/g),function(name,index){ String2.prototype[name] = function(){ var method = String.prototype[name]; var args = array(arguments); var self = this.core; var result = method.apply(self, args); if(typeof result === "string"){ return new String2(result) } return result; } }); var a = new String2("Oh"); var b = a.concat("ff"); alert(a); alert(b) alert(typeof a) alert(typeof b) alert(a instanceof String) alert(a instanceof String2)添加新方法:
var expansion = { trim : function(){ var str = this, str = str.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; while (ws.test(str.charAt(--i))); return str.slice(0, i + 1); }, dasherize:function() { return this.replace(/_/g, '-'); }, camelize:function(){ return this.replace(/_(\w)/g, function($1,$2){return $2.toUpperCase()}); } }; var String2 = function(){ this.core = arguments[0]; return this; }; String2.prototype = { constructor:String2, toString:function(){ return this.core; }, valueOf:function(){ return this.core; } }; var generics = "charAt,charCodeAt,concat,indexOf,lastIndexOf,match,\replace,search,slice,split,substr,substring,toLowerCase,toUpperCase,fontcolor,\big,small,anchor,link,bold,italics,sub,sup,fixed,fromCharCode,strike"; function each(array, block, context) { var i = 0,length = array.length; for (;i < length; i++) block.call(context, array[i], i, array); }; function iterate(object, block, context) { for (var key in object)//只遍历本地属性 if (object.hasOwnProperty(key)) block.call(context, object[key], key, object); }; var _slice = Array.prototype.slice; function array(iterable){ try{ return _slice.call(iterable,0); }catch(e){ var n = iterable.length || 0, array = new Array(n), i =0; for(;i<n;i++) array[n] = iterable[n]; return array; } }; var bridge = {}; iterate(expansion,function(method,name){ bridge[name] = method }) each(generics.match(/\w+/g),function(name,index){ bridge[name] = String.prototype[name]; }) iterate(bridge,function(method,name){ String2.prototype[name] = function(){ var args = array(arguments); // var self = this.core; var result = method.apply(this.valueOf(), args); if(typeof result === "string"){ return new String2(result) } return result; } }) var a = new String2(" Oh "); var b = a.trim().concat(" The world is beautiful!").replace(/\s+/g,"_").camelize(); //链式操作!!! alert(b);总结:想链式操作有三大要素:一是必须是对象,二必须是同一类型,三必须返回自身。另,对于String2,我们不但可以加入String的泛化方法与自定义方法,还可以把eval、parseInt、 parseFloat、decodeURI、encodeURI 、decodeURIComponent 、encodeURIComponent等方法塞进去!
- javascript String2
- String2
- InStr([start,]string1,string2[,compare])
- InStr([start, ]string1, string2[, compare])
- Java程序员笔试面试之String2
- XML 包含函数fn:contains(string1,string2)的用法
- 3.6 int 转化为string ,string 1+ string2
- java中字符串的比较,必须使用string1.equals(string2)来进行判断
- 汇编程序——把数据段中的串string1传送到附加段的string2中
- 有两个字符串数组,即 string1 与 string2,不使用任何C/C++库函数的情况下,请问如何交换这两个字符串数组中的数据
- 汇编语言: 试编写一段程序,要求比较两个字符串 string1 和 string2 所含字符是否相等,如相 等则显示“MATCH”, 若不相同则显示“NO MATCH”。
- Javascript
- JavaScript
- javascript
- javascript
- javascript
- javascript
- javascript
- 经典算法详解 之 冒泡排序
- 周鸿祎:抄袭+捆绑给中国互联网带来深远伤害
- JAVA 文件导出 IE/火狐中文乱码兼容
- Android如何防止apk程序被反编译
- win7下的telnet命令
- javascript String2
- guava-Preconditions
- IE8不支持canvas的解决方法
- DataInputStream和DataOutputStream
- 用GDB调试程序(二)
- SQL数据库如何用SQL语句备份数据库
- 在MyEclipse中去除项目的Hibernate能力
- Android系统源代码情景分析之基础知识
- Linux Platform Device and Driver,platform_add_devices()->platform_driver_register()