JavaScript中的空值和全局函数

时间:2015-02-12 04:49:56

标签: javascript

我正在尝试学习如何编写可重用的JavaScript库。为了做到这一点,我正在编写一些格式化工具。例如,我目前有以下内容:

Object.prototype.ToPercentage = function() {
  return this + '%';
};

我对这种方法很兴奋,因为我可以使用它类似于C#中的扩展方法。但是,我通过单元测试了解到这种方法不适用于空值。换句话说:

// This works
var v1 = 100;
var result1 = v1.ToPercentage();

// This causes an error
var v2 = null;
var result2 = v2.ToPercentage();  // Causes an exception because v2 is null

使用null值可以解决这一挑战吗?如果没有,我如何定义ToPercentage作为我的可重用库的一部分而不用担心它会与其他命名函数冲突?

谢谢!

2 个答案:

答案 0 :(得分:0)

我担心你无法在javascript中执行此操作。我更愿意编写一个全局函数并像这样使用它:

var v1 = 100;
var result1 = percentage(v1);

var v2 = null;
var result2 = percentage(v2);

如果您为库定义了“命名空间”。您可以将percentage函数添加到“命名空间”。像这样:

// 'mylib' is your namespace
window.mylib = {};

window.mylib.percentage = function (value) {
    // ...
};

var result = mylib.percentage(null);

命名空间mylib可以更改为更短的单词(因此它看起来更优雅)。例如,使用$而不是`mylib',那么您可以像这样使用它:

var result = $.percentage(null);

通知:许多现有的库(如jQuery)已经使用$,因此您应该确保它们不会发生冲突。我更喜欢使用项目名称的短别名(2或3个字符)作为'namesapce'。

答案 1 :(得分:0)

您可以使用唯一名称创建一个全局对象,并将您的函数放入其中:

window.MyLibrary = {
  ToPercentage: function(x) {
    return (typeof x === 'number') ? (x + '%') : 'error';
  },

  // other functions here
};

var v1 = 100;
var result1 = MyLibrary.ToPercentage(v1);

var v2 = null;
var result2 = MyLibrary.ToPercentage(v2);

或者,如果您真的希望它成为Object的一部分,请将其添加到Object本身而不是其原型:

Object.ToPercentage = function(x) {
  return (typeof x === 'number') ? (x + '%') : 'error';
};

var v1 = 100;
var result1 = Object.ToPercentage(v1);

var v2 = null;
var result2 = Object.ToPercentage(v2);

基本上,这使它成为一个类方法而不是实例方法。这样做的另一个好处是,属性名称“ToPercentage”不会出现在每个对象的枚举列表中。