玩转正则之highlight高亮

2013-10-07 05:16 by 靖鸣君, 584 阅读, 3 评论, 收藏编辑

  程序员在编写代码的时候少不了和字符串以及“查询”打交道,两者的交集中有一个叫做正则表达式的的东西,这家伙用好了可以提高编程效率,用不好的话...你可以先去好好学一学。

  关于正则的使用,举个简单的例子:

var m = location.href.match(/(\w+:)\/{0,3}([^\/]+)(?:(\/[^\?#]*))?(?:(\?[^#]+|.+))?(?:(#.*))?/);
var res = {
protocol: m[1],
host: m[2],
path: m[3],
search: m[4],
hash: m[5]
};

  憋了几分钟= =||,我也觉得这个正则不是特别好理解(红黑相间了,应该稍微清晰点),有些朋友可能不知道(?:content)是什么意思,还有类似(?!content)和(?=content)分组和前瞻的知识,建议去问问度哥谷娘

一. 正则应用DEMO示例

下面是一串随手写的代码,放在textarea中:

正则匹配,处理上面那堆字符串的小DEMO:

/**
* @author 靖鸣君
* @date 2013-10-06
* @email barret.china@gmail.com
*/

//outer var
var a = "this id outer string";

//closure
function b() {
    //inner var
    var a = "this is inner string";
    var g = a.replace(/this is inner string/g, function() {
        return new Function("/*clousure*/this.a")();
    });

/**
    * @description closure - regExp test
    * @author 靖鸣君
    */
    function c() {
        return {
            a: a,
            g: g
        }
    }

return c;
}

var s = b()(); //s.a, s.g

博客园引入个js文件还真罗嗦,有时候会报XSS(跨站脚本攻击)相关的错误,(如果木有正常显示,刷新下试试)。

如果还是没有,可以看另外一个demo:SAE/highlight

跟着提示,下一步下一步多点几下,可以看出效果还是可以滴。主要是这里的正则略微的麻烦,处理一个色变得琢磨老半天。

P.S:上面这玩意儿只是一个小测试,代码相当不健壮,拿着学习正则练手~

二. 需要注意的地方

//step config
var config = {
regs: [
/^\s+|\s+$/g,
/(["'])(?:\\.|[^\\\n])*?\1/g,
/\/(?!\*|span).+\/(?!span)[gim]*/g,
/(\/\/.*|\/\*[\S\s]+?\*\/)/g,
/(\*\s*)(@\w+)(?=\s*)/g,
/\b...\b/g
],
  //...
};

这些正则我是分开来写的,主要是为了做上面那个demo,方便单步显示。但是把这些正则分开写是相当不合理的,放在textarea中的是一串没有任何标签的字符串,为了着色,每处理一个正则都会在codes中插入一些标签(我这里用的是span),当我们处理下一个正则的时候就必须得考虑上一步加入的标签,这样会很大程度提高开发难度,最好的做法是把这些正则都放到一坨,然后用|隔开:

var reg = (/^\s+|\s+$/)|(/(["'])(?:\\.|[^\\\n])*?\1/)|(/\/(?!\*|span).+\/(?!span)[gim]*/)|(/(\/\/.*|\/\*[\S\s]+?\*\/)/)|(/(\*\s*)(@\w+)(?=\s*)/)|(/\b(break|continue|do|for|in|function|if|else|return|switch|throw|try|catch|finally|var|while|with|case|new|typeof|instance|delete|void|Object|Array|String|Number|Boolean|Function|RegExp|Date|Math|window|document|navigator|location|true|false|null|undefined|NaN)\b)

这样放的好处是可以直接

codes.replace(reg, function(){
var args = arguments;
//...
});

一次性处理,不用担心插入标签影响最后的结果,因为标签是同一时间插入的,不会有干扰。

代码高亮插件highlight的基本原理也差不多,只不过他的容错机制和代码健壮性这块做的更加完善,我在代码里头加了一个配置文件,

var colors = {
string: "#FFA0A0",
reg: "#16E916",
note: "#888",
tag: "orange",
keywords: "#B0B0FF"
};

按照自己的喜好,也可以加以修改,类似这样的扩展,我们在写代码的时候稍微注意下,多留几个接口就好了。(不过这些活儿干起来都还挺辛苦的~)

没有做成插件,也没这个必要,知道基本原理然后动手实践下就差不多了。

三. 小结

类似很多的前端模板,artTemplatebaiduTemplate等都是对正则表达式的绝伦应用,很值得去看看源码,好好钻研人家都考虑了那些容易出错的点,源码都不长,两三百行。了解一个大概比较容易,但是当自己动手的时候总会发现很多细节问题处理不好,我那上面几个正则就倒弄了半天= =

另外一个配色方案,随便弄的,戳这里SAE/highlight

正则表达式,用起来还是挺方便的。正则技能,你值得拥有~

JavaScript中的继承

2013-10-07 01:24 by 二当家的, 348 阅读, 0 评论, 收藏编辑

主要有:

  • 构造函数继承(类继承)

  • 原型继承

  • 掺元类(拷贝继承)

构造函数继承的实现方式主要是借助于JavaScript中的 call , apply 方法可以绑定this的特点,以及使用 new 关键字生成实例,模仿传统的继承方式,而后者的继承才是JavaScript语言本身提倡的继承方式。相比于类继承,原型继承具有节约内存,效率较高等特点,代码也更优雅。下面以具体的例子来简单说明下三种继承的不同。

比如目前有两个类,分别是

      function super(id){

      this.superId = id;

      }

      function sub(name){

      this.name = name;

      }

要让sub继承super,使用类继承可以这样实现

      function sub(id,name){

      super.call(this,id);

      this.name = name;

      }

这样的方式也可以实现多重继承,只要多加几条 call 或者 appley 语句即可。

使用这种方法的缺点是每次实例化一个对象都会为对象中的属性和方法创建新的副本,浪费内存,而且这样的继承无法用 instanceof 操作符来判断。

而原型继承则是

      sub.prototype = new super();

      sub.prototype.constructor = sub;

这是最简单最少语句的原型继承实现。已经可以实现我们要的效果,不过还可以继续改进。

在sub对象中,不变的属性和方法我们都可以放在其原型中比如:

      function super(){}

      super.prototype.superId = 100086;

然后我们可以让sub直接继承super的原型

      sub.prototype = super.prototype;

      sub.prototype.constructor = sub;

这样写的好处在于可以避免创建超类的新实例,因为它可能非常大或超类的构造函数有一些其他的副作用比如要进行一些复杂的运算,总之,可以减少这方面时间的花费,减少内存的占用,提高代码效率,当然也还有一些缺点,那就是现在的 sub.prototype 与 super.prototype 指向了同一个对象,那么对sub.prototype的任何修改都会反映到super.prototype上,如果此时还有其他的对象继承了super.prototype那么,就会直接影响到其他的对象,这不是我们所希望看到的。而且再看这句代码:

      sub.prototype.constructor = sub;

这句代码的本意是想修复sub.prototype的constructor属性,而现在将会连同super.prototype.constructor也一起修改了。

所以以上的原型继承还需要继续完善,看下面:

      var F = function(){};

      F.prototype = super.prototype;

      sub.prototype = new F();

      sub.prototype.constructor = sub;

这里借助了一个空对象作为中介,这样上面所提到的问题就解决了,改变sub.prototype只会修改F的实例,而不会影响到super.prototypel了,而且由于F是空对象,几乎不占内存。将上面的方法封装成一个函数

      function extend(sub, super) { 
            var F = function(){};

            F.prototype = super.prototype;

            sub.prototype = new F();

            sub.prototype.constructor = sub;

            sub.super= super.prototype;

            if(super.prototype.constructor == Object.prototype.constructor){

                   super.prototype.constructor = super

            }

      }

上面的最终版本多出了额外的几行代码,它的作用是提供给sub一个super属性,来弱化子类与超类之间的耦合关系,并且确保超类的的prototype的constructor属性已经被正确设置,即使超类就是Object本身。这在既要调用超类的方法又想重写超类的某个方法时可以派上用场,可以直接通过super属性来访问。据说这个函数就是YUI库的继承方式。

除了上面两种继承方式外,还有一种方法——使用掺元类,通过对象扩充的方式让这些类包含的方法共享给其他类,直观点就是拷贝复制。

function augment(reveivingClass, givingClass){

for(methodName in givingClass.prototype){

if(!receivingClass.prototype[methodName]){

receivingClass.prototype[methodName] = givingClass.prototype[methodName];

}

}

}

上面就是一个简单的扩充方法。还可以改进一下,如果掺元类中包含许多方法,但我们只想要复制其中的一两个,那么上面这个函数还可以再添加一个参数表示要拷贝的方法数组

function augment(reveivingClass, givingClass, copyArr){

if(copyArr){

for(var i =  0; i < copyArr.length; i++){

var methodName = copyArr[i];

if(!receivingClass.prototype[methodName]){

receivingClass.prototype[methodName] = givingClass.prototype[methodName];

}

}

}else{

for(var methodName in givingClass.prototype){

if(!receivingClass.prototype[methodName]){

receivingClass.prototype[methodName] = givingClass.prototype[methodName];

}

}

}

}

现在就可以使用 augment(sub, super, [‘trim’]) 这样的语句来达到只为sub类添加一个trim方法的目的了,如果想添加更多的方法,只要把方法方法名传入数组即可。

用这样的方法扩充一个类有时比继承另一个类更合适。

总结

这次主要学习了继承的几种不同实现方式,以及每种方法的优缺点,主要参考综合了阮一峰大神的关于JavaScript面向对象编程系列的博文以及JavaScript设计模式继承章节的内容。

 
 
 
标签: JavaScript继承

highlight高亮的更多相关文章

  1. 正则&highlight高亮实现(干货)

    写完正则表达式以后在浏览器上检测实在是不方便,于是就写了一个JS正则小工具,大大地提高了学习效率.学习之余用正则实现了一个highlight高亮demo,欢迎交流. 什么是正则表达式? 简单的说:正则 ...

  2. highlight高亮风格

    highlight代码高亮的style有很多个,今天闲着没事,突然想看看各个style的效果.列在这里,以后想用的时候看看. ------------------------------------- ...

  3. 玩转正则之highlight高亮

    程序员在编写代码的时候少不了和字符串以及“查询”打交道,两者的交集中有一个叫做正则表达式的的东西,这家伙用好了可以提高编程效率,用不好的话...你可以先去好好学一学. 关于正则的使用,举个简单的例子: ...

  4. 如何使用 highlight.js 高亮代码

    highlight 是一款简单易用的 web 代码高亮插件,可以自动检测编程语言并高亮,兼容各种框架,可以说是十分强大了.下面就简单介绍一下如何使用这款插件. 两种使用方式: 1. 手动选择主题,官网 ...

  5. elasticsearch高亮之highlight原理

    一.highlight简介 highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果: highlight功能通常包 ...

  6. js 正则练习之语法高亮

    原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先 ...

  7. 高亮代码 SyntaxHighlighter

    SyntaxHighlighter: http://alexgorbatchev.com/SyntaxHighlighter/download/ demo <!DOCTYPE html PUBL ...

  8. WordPress代码高亮插件SyntaxHighlighter终极使用详解

    子曰: 工欲善其事,必先利其器.作为码农一枚,再加上站长这个已经不再光鲜的称呼,岂能没有一款经济实用.操作简单.而且功能必须强大.样式也必须好看的Wordpress代码高亮插件?!作为一个视代码如生命 ...

  9. 实战JS正则表达式

    -正则表达式是一种文本模式的匹配工具. -文章导读: --1.正则对象的属性和方法 --2.字符串对象的方法 --3.使用正则表达式: ---3.1 给字符串加上千分符 ---3.2 字符串中出现次数 ...

随机推荐

  1. NYoj WAJUEJI which home strong!(简单搜索)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1100 这道题,自己初写搜索,给学长气的只打我,Orz....... 搜索的思路要理 ...

  2. Office转HTML

    /// <summary> /// word转成html /// </summary> /// <param name="path"></ ...

  3. 导入三方包,出现ClassNotFoundException

    在项目中须要引用settings模块里面的某个活动.在eclipse中导入settins.jar包之后,使用例如以下方式启动: Intent intent = new Intent(); intent ...

  4. JavaEE Tutorials (2) - 使用教程示例

    2.1 必要软件27 2.1.1 Java EE 7软件开发包28 2.1.2 Java平台标准版28 2.1.3 Java EE 7教程组件28 2.1.4 NetBeans IDE29 2.1.5 ...

  5. SharePoint 创建一个简单的Web Part 部分

    SharePoint 创建一个简单的Web Part 部分 标准Web零件有时会很强大,运行多个功能的能力. 本文介绍了如何使用Visual Studio 创建一个简单的Web部分. 1. 打开VS, ...

  6. iOS开发之protocol和delegate

     protocol--协议 协议是用来定义对象的属性,行为和用于回调的.     协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...

  7. 如何监控第三方应用程序(SOAP or RESTful client)访问HTTPS当数据站点?

    随着越来越多的互联网应用,在我们日常的开发和调试,其中(例如,调试SOAP和RESTFul什么时候),我们经常需要访问工具,通过第三方获取HTTPS网站.为了简化叙述说明,如本文所用,IE浏览器访问G ...

  8. Socket 由浅入深系列--------- 简单实现编程(三)

    socket 由浅入深 原理(一)介绍了一些,以下也就是简单实现,并未考虑其它性能化! 使用TCP的server客户机举例 server 设置一个简单的TCPserver涉及下列步骤: 调用 sock ...

  9. Java数据库编程、XML解析技术

    数据库编程 JDBC概述 是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力. 是一种用于执行SQL语句的Java API,可以为多种关系数据库 ...

  10. Linq的理论知识

    概述 前面的博客中写到过关于Linq的一些知识,可是,没有具体的说Linq,本篇博客将会说一下Linq. 什么是Linq Linq是一个概念,它实现了数据查询使用同一方式,即,它使我们程序猿通过使用它 ...