首页 > 语言 > JavaScript > 正文

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

2024-05-06 14:22:09
字体:
来源:转载
供稿:网友

早上看到《JavaScript 每周导读》【第三期】一文,里面发现一篇文章(Extending JavaScript – The Right Way),觉得还不错,翻译过来跟大家共享,本文并不是逐字逐句进行翻译,尽量说得通俗易懂。

原文地址:Extending JavaScript – The Right Way

以下是译文

  JavaScript已经内置了很多强大的方法,但有时你需要的某个功能在内置的方法中没有,我们怎么来优雅地扩展JavaScript功能呢。
  例如我们想增加一个capitalize()方法来实现首字母大写,通常我们这样写:
代码如下:
if(!String.prototype.capitalize)
{
String.prototype.capitalize = function()
{
return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
}
}

  上面的代码可以正常使用,但如果在某个地方有下面的代码:
代码如下:
var strings = "yay";
for(i in strings) console.log(i + ":" + strings[i]);

  我们得到的结果是这样的:
0: y
1: a
2: y
capitalize: function () { return this.slice(0, 1).toUpperCase() + this.slice(1).toLowerCase(); }
  这显然不是我们想要的结果,输出了我们增加的方法的原因是我们增加的方法的enumerable属性默认为true。
  我们可以通过简单地把枚举属性(enumerable)设置为false避免这个问题,使用defineProperty方法进行功能的扩展:
代码如下:
if(!String.prototype.capitalize)
{
Object.defineProperty(String.prototype, 'capitalize',
{
value: function()
{
return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
},
enumerable: false
});
}

  现在我们再运行这段代码:
代码如下:
var strings = "yay";
for(i in strings) console.log(i + ":" + strings[i]);

  我们得到的结果是:
0: y
1: a
2: y
  要注意的是,用循环没有输出的并不代表不存在,我们可以通过下面的代码查看到定义:
代码如下:
var strings = "yay";
console.log(strings.capitalize)

  会输出:
代码如下:
function () { return this.slice(0, 1).toUpperCase() + this.slice(1).toLowerCase(); }

  用这种方式扩展JavaScript功能比较灵活,我们可以用这种方式来定义我们自己的对象,并设置一些默认值。
  以下是另外几个扩展方法,你可以在自己的项目中使用:
  String.pxToInt()
  把"200px"这样的字符串转换为数字 200 :
代码如下:
if(!String.prototype.pxToInt)
{
Object.defineProperty(String.prototype, 'pxToInt',
{
value: function()
{
return parseInt(this.split('px')[0]);
},
enumerable: false
});
}

  String.isHex()
  判断一个字符串是否是16进制表示的,如"#CCC" 或 "#CACACA"
代码如下:
if(!String.prototype.isHex)
{
Object.defineProperty(String.prototype, 'isHex',

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选