JavaScript中的空值和全局函数

JavaScript中的空值和全局函数,javascript,Javascript,我正在尝试学习如何编写一个可重用的JavaScript库。为了做到这一点,我正在编写一些格式化工具。例如,我目前有以下几点: Object.prototype.ToPercentage = function() { return this + '%'; }; 我对这种方法很兴奋,因为我可以使用类似于C中的扩展方法的方法。但是,我通过单元测试了解到,这种方法不能处理空值。换言之: // This works var v1 = 100; var result1 = v1.ToPercentag

我正在尝试学习如何编写一个可重用的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
有没有办法用空值来解决这个难题?如果不是,我如何将ToPercentage定义为可重用库的一部分,而不用担心它会与其他命名函数冲突


谢谢

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

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

var v2 = null;
var result2 = percentage(v2);
var result = $.percentage(null);
如果已为库定义了“命名空间”。您可以将百分比函数添加到“名称空间”。像这样:

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

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

var result = mylib.percentage(null);
名称空间mylib可以更改为较短的单词,因此看起来更优雅。例如,使用$而不是'mylib',然后您可以这样使用它:

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

var v2 = null;
var result2 = percentage(v2);
var result = $.percentage(null);

注意:许多像jQuery这样的现有库已经使用$,所以您应该确保它们不会冲突。我更愿意使用项目名称的短别名2或3个字符作为“namesapce”。

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

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.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不会出现在每个对象的属性枚举列表中。

如果空值或未定义的值有效,您希望它有什么结果?