`
ArcTan
  • 浏览: 3886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

扩展JavaScript的正确方法(翻译)

阅读更多
本文翻译自【 Extending JavaScript – The Right Way

JavaScript comes with a lot of great functionality built in, but what if there is a function you need which is missing. How can we build them in seaminglessly in an elegant way that extends the functionality of our beloved JavaScript. The following will outline a couple methods to extend the existing functionality of JavaScript, both effective but one a little more functionally complete.

JavaScript 内建了很多很棒的函数,但也漏掉了一些我们很需要的,因此需要我们自己扩展。但如何才能将扩展的代码与亲爱的JavaScript优雅的融合在一起呢?接下来将向你展示几个小函数,扩展了已有的功能,让JavaScript更完整一点儿。

Say we want to create a function .capitalize() to extend the String type of JavaScript so that it behaves in a way similar to String.toLowerCase() or String.toUpperCase(). We can do this by prototyping the String object adding in our new function.

首先我们要为String类型扩展一个.capitalize()函数,它使用起来类似 String.toLowerCase() 或 String.toUpperCase() ,可以返回一个新的,被格式化为首字母大写,其他全部小写的字符串。我们可以用操作对象原型 prototype 的方式添加我们的新函数

This is usually done in the simplest way with the code below:

通常最简单的写法如下:

if(!String.prototype.capitalize)
{
    String.prototype.capitalize = function()
    {
        return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
    }
}


This works fine and dandy but lets say we were to do the following:

它能正常工作,但如果像下面这样用:

var strings = "yay";
for(i in strings) console.log(i + ":" + strings[i]);


We would get the output:

我们会得到下面的结果:

0: y
1: a
2: y
capitalize: function () { return this.slice(0, 1).toUpperCase() + this.slice(1).toLowerCase(); }


Our capitalize function shows up in our for loop, which is correct since it is now a property of all strings. The reason it is doing this is because the enumerable property for our new function is by default set to true.

我们的 capitalize 函数也出现在了循环中,并且作为一个属性出现在所有String对象中。造成此结果的原因是,我们新增加的函数,会被做上一个标记,它是通过设置改函数的 enumerable 属性为 true 来实现的,而通过这样的方式新增的函数默认就会将 enumerable 属性为 true 。

However, this was wreaking havoc on a plugin I had written that happened to be iterating through each character in a string. By simply changing the enumerable property to false we can avoid this problem which can be done by using the defineProperty method like so:

虽然在做String迭代操作时,我们书写的这个插件会造成严重的不良影响,但也不用如此担心。只要稍加修改,使用 defineProperty 函数来设置新增函数的 enumerable 值为 false,就可以解决这个问题,像下面这样:

if(!String.prototype.capitalize)
{
    Object.defineProperty(String.prototype, 'capitalize',
    {
       value: function()
       {
           return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
       },
       enumerable: false
    });
}


Now when we run our loop we get the outcome we were more likely expecting.

现在再运行之前的迭代代码,便会得到我们想要的结果:

var strings = "yay";
for(i in strings) console.log(i + ":" + strings[i]);

0: y
1: a
2: y


The reason for this may not seem as obvious when we’re looking at strings, but it gives us a lot of flexibility should we need it. It can come in really handy when defining our own objects and setting some default values that we would want to expose.

Below are just a few more examples you may wish to use in some of your own projects:

因为这个特性,字符串看上去并没有明显的变化,但却带来了很多我们需要的灵活性。借此,在实际应用中,我们可以方便的定义定义或设置我们自己的对象,使我们定义的方法可以按我们想要的方式展现给外界

下面是一些其他小函数的代码,这些例子可能也是你在项目中想要的。


        String.pxToInt()
        Convert css px value like “200px” to an Integer.
        将“200px”这样css格式的数值转成一个Integer
if(!String.prototype.pxToInt)
{
    Object.defineProperty(String.prototype, 'pxToInt',
    {
        value: function()
        {
            return parseInt(this.split('px')[0]);
        },
        enumerable: false
    });
}


        String.isHex()
        Checks if string is valid Hex value such as “#CCC” or “#CACACA”.
        验证字符串格式是否符合 HEX 颜色,形如 “#CCC” 或 “#CACACA”
if(!String.prototype.isHex)
{
    Object.defineProperty(String.prototype, 'isHex',
    {
        value: function()
        {
            return this.substring(0,1) == '#' &&  
                   (this.length == 4 || this.length == 7) && 
                   /^[0-9a-fA-F]+$/.test(this.slice(1));
        },
        enumerable: false
    });
}


        String.reverse()
        Reverse a string.
        反转字符串
if(!String.prototype.reverse)
{
    Object.defineProperty(String.prototype, 'reverse',
    {
        value: function()
        {
            return this.split( '' ).reverse().join( '' );
        },
        enumerable: false
    });
}



        String.wordCount()
        Count the number of words in a given string, words being separated by spaces.
        统计给出字符串的英文单词数,通常英文单词都是用一个空格隔开的。
if(!String.prototype.wordCount)
{
    Object.defineProperty(String.prototype, 'wordCount',
    {
        value: function()
        {
            return this.split(' ').length;
        },
        enumerable: false
    });
}



        String.htmlEntities()
        Converts HTML characters like < and > to HTML encoded special characters.
        将字符串中的HTML字符转换成HTML实体
if(!String.prototype.htmlEntities)
{
    Object.defineProperty(String.prototype, 'htmlEntities',
    {
        value: function()
        {
            return String(this).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"');
        },
        enumerable: false
    });
}

此段代码被原作者发布文章的网页进行了错误的解释,下面给出正确的代码
if(!String.prototype.htmlEntities)
{
    Object.defineProperty(String.prototype, 'htmlEntities',
    {
        value: function()
        {
            return String(this).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
        },
        enumerable: false
    });
}


        String.stripTags()
        Strips out all HTML tags from the string.
if(!String.prototype.stripTags)
{
    Object.defineProperty(String.prototype, 'stripTags',
    {
        value: function()
        {
            return this.replace(/<\/?[^>]+>/gi, '');
        },
        enumerable: false
    });
}



        String.trim()
        Removes all leading and trailing white space from string.
        去除所有头尾空格
if(!String.prototype.trim)
{
    Object.defineProperty(String.prototype, 'trim',
    {
        value: function()
        {
            return this.replace(/^\s*/, "").replace(/\s*$/, "");
        },
        enumerable: false
    });
}



        String.stripNonAlpha()
        Removes all non-alphanumeric characters from string.
        去除所有非字母字符
if(!String.prototype.stripNonAlpha)
{
    Object.defineProperty(String.prototype, 'stripNonAlpha',
    {
        value: function()
        {
            return this.replace(/[^A-Za-z ]+/g, "");
        },
        enumerable: false
    });
}



        String.sizeof()
        The the size of an object, for example: {one: “and”, two: “and”} would equal 2
        统计对象包含的成员数。例如:{one: “and”, two: “and”}的成员数为2
if(!Object.prototype.sizeof)
{
    Object.defineProperty(Object.prototype, 'sizeof',
    {
        value: function()
        {
            var counter = 0;
            for(index in this) counter++;
            
            return counter;
        },
        enumerable: false
    });
}
分享到:
评论

相关推荐

    扩展JavaScript功能的正确方法(译文)

    原文地址:Extending JavaScript – The Right Way以下是译文 JavaScript已经内置了很多强大的方法,但有时你需要的某个功能在内置的方法中没有,我们怎么来优雅地扩展JavaScript功能呢。 例如我们想增加一个...

    JavaScript中英文资料对照外文翻译文献综述.docx

    JavaScript 中英文资料对照外文翻译文献综述是指在 JavaScript 程序中,如何使用语言的动态特性来提高程序的正确性、安全性和性能,并提供更好的检测工具,以帮助开发者尽早的发现程序中的漏洞。

    JavaScript_接下来学一下到处翻译.zip

    - 翻译:使用`t`函数或`i18next.t`方法来调用翻译文本,如`t('hello')`。 - 多语言切换:i18next提供API和事件来切换当前语言。 - 资源管理:将每种语言的翻译文本保存为JSON文件,如`en.json`、`fr.json`等。 -...

    clean-code-javascript

    这不仅仅是一份样式指南,更是一种关于如何编写可读性强、可重用性高且易于重构的JavaScript软件的方法论。 #### 二、变量命名 在编写代码时,变量的命名至关重要。好的命名能够帮助开发者快速理解变量的作用,...

    碧蓝幻想翻译.zip

    在大型游戏翻译项目中,这种文档是非常重要的,因为它确保了所有参与者对翻译目标和方法有统一的理解,从而提高工作效率并保持翻译质量的一致性。 "BLHXFY_master.zip"是主文件,很可能包含了游戏的JavaScript代码...

    谷歌浏览器扩展程序 -

    这些扩展程序是由JavaScript、HTML和CSS等Web技术编写,通过Chrome的API接口与浏览器进行交互,提供诸如广告拦截、网页翻译、效率工具等各种实用功能。 开源项目是指源代码对公众开放的软件项目,鼓励社区成员参与...

    pscript:JavaScript 翻译器

    8. **兼容性**:项目可能关注不同版本的JavaScript语法和特性,确保新旧版本的代码都能正确处理。 9. **文档和示例**:为了帮助用户理解和使用pscript,项目通常会包含详细的文档,介绍如何使用工具、其工作原理...

    Zotero translator中文网页抓取翻译器.zip

    而"Zotero translator中文网页抓取翻译器"则是针对Zotero的一个扩展插件,专门用于从中文网页中抓取和翻译信息。这个压缩包文件包含的可能是一个JavaScript代码实现的翻译器,它能够帮助Zotero更好地处理中文网页...

    FBT是一个来自Facebook的JavaScript国际化框架强大又灵活而且简单直观

    通过捕获相关上下文,FBT可以确保正确的翻译被选择。 4. **模块化管理**:FBT将翻译内容组织成模块,每个模块对应应用的一部分。这使得翻译工作可以并行进行,团队成员可以专注于他们负责的部分,提高工作效率。 5...

    i18next是浏览器或任何其他JavaScript环境例如nodejs的非常流行的国际化框架

    总结,i18next作为JavaScript的国际化框架,提供了丰富的功能和高度的可扩展性,无论是小型项目还是大型复杂应用,都能够有效地满足其国际化需求。通过与各种前端框架的集成,i18next已成为JavaScript开发中的重要...

    Tiny tools(迷你工具)是一个Chrome的扩展

    2. **翻译工具**:集成的翻译功能使得用户无需离开当前页面就能进行快速的文本翻译,支持多种语言之间的互译,对于跨语言交流和学习非常有帮助。 3. **时间戳转换**:无论是Unix时间戳还是自定义格式的时间戳,Tiny...

    Language-Helper:轻量级Chrome扩展程序,用于中文短语到英语翻译

    总的来说,"Language-Helper"是一款利用JavaScript技术构建的Chrome扩展,它利用jQuery库提供简洁的用户界面和交互体验,通过调用在线翻译API实现中文到英文的即时翻译。对于熟悉JavaScript和Chrome扩展开发的程序员...

    osm-translate:小型Javascript库,用于翻译Openstreetmap KeyValue

    开发者可以根据需要修改`src`目录中的翻译规则,或者通过`osmTranslate.addTranslation()`方法动态添加新的翻译规则。 ### 结论 `osm-translate` 提供了一个有效的解决方案,使得OpenStreetMap数据能够在各种语言...

    webexti18n用于简化i18n在Web扩展中处理

    `webext-i18n` 是一个专门为Web扩展设计的JavaScript库,它旨在简化这一过程,帮助开发者更高效地管理和应用多语言资源。 1. **基本概念** - **国际化(i18n)**:是指为软件设计出能够适应多种语言和文化环境的...

    Chrome浏览器划词翻译插件

    在Chrome浏览器中,划词翻译插件的工作原理是利用JavaScript等前端技术监听用户的鼠标动作,当用户选中一段文本后,插件会自动检测到这一选择并触发翻译功能。翻译引擎可以是谷歌翻译、有道翻译等知名服务,为用户...

    翻译APP源码

    在源码中,测试脚本和调试工具是必不可少的,用于验证功能的正确性、性能和兼容性,确保翻译APP在各种环境下的稳定运行。 总的来说,翻译APP源码是一个复杂的系统,融合了现代计算机科学的多个领域,涉及到语言学...

    javascript实现的基于金山词霸网络翻译的代码

    这段代码是使用JavaScript实现的一个基于金山词霸网络翻译的在线查询工具。金山词霸是一个知名的中文词典和翻译服务,提供了API接口供开发者调用,用于实现各种与翻译相关的功能。在这个例子中,代码通过创建...

    javascript常用工具集(带使用示例)

    * 从身份证号中得到生日和...* 正则表达式实现JavaScript日期格式化对Date的扩展,将 Date 转化为指定格式的String * 返回当天是星期几 * 常用正则表达式 * 将阿拉伯数字翻译成中文的大写数字 * 将日期转换成中文日期

    chrome helloworld程序

    Chrome扩展是基于JavaScript、HTML和CSS构建的小型应用程序,它们可以增强或修改浏览器的功能,提供诸如书签管理、广告拦截、网页翻译等各种服务。 首先,我们需要了解Chrome扩展的基本结构。一个基础的Chrome扩展...

Global site tag (gtag.js) - Google Analytics