我正在尝试学习如何编写可重用的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
作为我的可重用库的一部分而不用担心它会与其他命名函数冲突?
谢谢!
答案 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”不会出现在每个对象的枚举列表中。