Prototype源码浅析 String部分(四)之补充_prototype

替换 interpolate  | sub |  scan |  truncate | gsub

interpolate : 将字符串看作一个模板,并使用 object 的属性填充它。
sub : 将字符串中前指定个个与 pattern 指定的模式匹配的子串用 replacement 替换
scan : 遍历字符串中与参数 pattern 指定的模式匹配的所有子串。返回原始字符串本身。
truncate : 将字符串截短为指定的长度(包含后缀部分), 并添加一个后缀。
gsub :将字符串中所有与 pattern 指定的模式匹配的值全部用 replacement 替换掉

上面的方法中,最重要的一个方法是gsub,具体说明参见《浅析Prototype的模板类--Template》
sub除了可以限定次数外,其他与gsub完全一致。

复制代码 代码如下:

function sub(pattern, replacement, count) {
replacement = prepareReplacement(replacement);
count = Object.isUndefined(count) ? 1 : count;
return this.gsub(pattern, function(match) {
if (--count < 0) return match[0];
return replacement(match);
});
}

scan也是一样的,不过scan最后返回的是字符串本身而已。
interpolate 是将字符串当做模板来用,核心还是gsub
truncate 是唯一有点区别的(我现在依稀感觉我分错类了)。
以字符串'fuck the gfw'为例,truncate 的执行'fuck the gfw'.truncate(10,'****')的步骤是:
1、获得前面10 - '****'.length个字符 'fuck t'
2、拼上后缀'****',得到 'fuck t****',长度为10.
处理很简单,源码也简单:

复制代码 代码如下:

function truncate(length, truncation) {
length = length || 30;//默认长度30
truncation = Object.isUndefined(truncation) ? '...' : truncation;//默认后缀...
return this.length > length ?
this.slice(0, length - truncation.length) + truncation : String(this);
}

另:Prototype的一个方便之处就是随时可以抽取有用的代码作为单独的部分或者收为自己用。下面是单独提出来的模板方法。

复制代码 代码如下:

function Template(template, pattern){
this.template = template;
this.pattern = pattern || /(^|.|\r|\n)(#\{(.*?)\})/;
}
Template.prototype = (function(){
function evaluate(obj){
return gsub.call(this,function(match){
if(obj == null){
return match[0] + '';
}
var before = match[1] || '';
if(before == '\\'){
return match[2];
}
var ctx = obj;
var expr = match[3];
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
match = pattern.exec(expr);
if (match == null){
return before;
}
while (match != null) {
var comp = match[1].search(/^\[/) != -1 ? match[2].replace(/\\\\]/g, ']') : match[1];
ctx = ctx[comp];
if (null == ctx || '' == match[3]) break;
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
match = pattern.exec(expr);
}
return before + (ctx === null ? '' : String(ctx));
});
}
function gsub(replacement){
var pattern = this.pattern;
var result = '';
var match = null;
var source = this.template;
if (!(pattern.length || pattern.source)) {
replacement = replacement('');
return replacement + source.split('').join(replacement) + replacement;
}
while (source.length > 0) {
if (match = source.match(pattern)) {
result += source.slice(0, match.index);
result += replacement(match) === null ? '' : String(replacement(match));
source = source.slice(match.index + match[0].length);
}else {
result += source;
source = '';
}
}
return result;
}
return {
constructor : Template,
evaluate : evaluate
}
})();

复制代码 代码如下:

var template = new Template('my age is : #{name.age}');
console.log(template.evaluate({name : {age : 24}}));//my age is : 24

String部分(完)

时间: 2024-10-27 09:19:17

Prototype源码浅析 String部分(四)之补充_prototype的相关文章

Prototype源码浅析 String部分(二)_prototype

格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times 这里面一个有用的方法是inspect,按照参考手册的说明,他的作用是"返回该字符串针对调试的字符串表现形式(即用单引号或双引号包括起来,并使用 '\' 对特殊字符进行转义)",在Object的toJSON里面也涉及到这个方法. 既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直

Prototype源码浅析 Enumerable部分之each方法_prototype

在javascript中,根本找不到Enumerable的影子,因为这一块是Prototype作者从Ruby中借鉴过来的.并且Enumerable在实际中根本没有直接应用的机会,都是混入到其他的对象中,可以说是其他对象的一个"父类"(不过只是调用了Object的extend方法,进行了方法的直接拷贝而已). 我并不熟悉Ruby,不过看Enumerable中的一些方法,倒是跟Python中的有几分相似. Enumerable其中一个最重要的方法是each,each这个方法应该都比较熟悉,

Prototype源码浅析 String部分(一)之有关indexOf优化_prototype

添加到String.prototype中的方法比较多,不过归结起来,大致分为下面几类: 分类 方法名  原始能力增强               strip |  include  |  startsWith  |  endsWith |  empty |  blank 格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times 替换 interpolat

Prototype源码浅析 Enumerable部分(二)_prototype

前面each方法中掉了一个方面没有说,就是源码中的$break和$continue.这两个变量是预定义的,其作用相当于普通循环里面的break和continue语句的作用.出于效率的考虑,在某些操作中并不需要完全遍历一个集合(不局限于一个数组),所以break和continue还是很必要的. 对于一个循环来说,对比下面几种退出循环的方式: 复制代码 代码如下: var array_1 = [1,2,3]; var array_2 = ['a','b','c']; (function(){ for

我对java String的理解 及 源码浅析

一.char说起到String 这也是自己第二次回过头来啃java基础书,小生自认为愚昧无知.如果大神有好的教育,可以评论私信.以下都是我的看法: 为什么说char 呢,我这里先卖个关子.在java中,char是用unicode编码的,占16位(2字节).从ansi编码(1字节)到unicode编码(2字 节).Java中使用Unicode的原因是,Java的Applet(网页)运行,Unicode里面包含最多最广比如:中 文,English,Spanish,German, French等.因此

Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在IDE中调试Android程序,说白了就是debug工具.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行And

Ajax::prototype 源码解读_javascript技巧

AJAX之旅(1):由prototype_1.3.1进入javascript殿堂-类的初探  还是决定冠上ajax的头衔,毕竟很多人会用这个关键词搜索.虽然我认为这只是个炒作的概念,不过不得不承认ajax叫起来要方便多了.所以ajax的意思我就不详细解释了. 写这个教程的起因很简单:经过一段时间的ajax学习,有一些体会,并且越发认识到ajax技术的强大,所以决定记录下来,顺便也是对自己思路的整理.有关这个教程的后续,请关注http://www.x2design.net 前几年,javascri

【深入浅出jQuery】源码浅析2--奇技淫巧

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下

PgSQL · 最佳实践 · pg_rman源码浅析与使用

背景 对于商业数据库来说,备份的功能一般都非常的全面. 比如Oracle,它的备份工具rman是非常强大的,很多年前就已经支持全量.增量.归档的备份模式,支持压缩等. 还支持元数据存储到数据库中,管理也非常的方便,例如保留多少归档,备份集的管理也很方便,例如要恢复到什么时间点,将此前的备份清除等等. 对于开源数据库来说,支持向商业版本这么丰富功能的比较少,PostgreSQL算是非常完善的一个. PostgreSQL作为最高级的开源数据库,备份方面已经向商业数据库看齐. 目前PostgreSQL