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


Posted in Javascript onJanuary 16, 2012
替换 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部分(完)
Javascript 相关文章推荐
js创建对象的几种常用方式小结(推荐)
Oct 24 Javascript
javascript使用onclick事件改变选中行的颜色
Dec 30 Javascript
js检测输入内容全为空格的方法
May 03 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
javascript常用方法总结
May 14 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 Javascript
vue单页缓存方案分析及实现
Sep 25 Javascript
vue 之 css module的使用方法
Dec 04 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 Javascript
layui 表单标签的校验方法
Sep 04 Javascript
Prototype源码浅析 String部分(二)
Jan 16 #Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
Jan 15 #Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 #Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 #Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 #Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 #Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 #Javascript
You might like
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
javascript实现连续赋值
2015/08/10 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
六十岁生日答谢词
2014/01/10 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
承诺书模板
2014/08/30 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
新员工入职欢迎词
2015/01/23 职场文书
学生逃课检讨书
2015/02/17 职场文书
世界文化遗产导游词
2019/08/07 职场文书
Python代码实现双链表
2022/05/25 Python