js库和命名空间污染的设计

时间:2015-04-26 20:59:58

标签: javascript module namespaces name-collision

我想创建一个js库(用于帮助测试)。我希望这个库向Array或Object添加一个新方法X。但是有些人可能不想要这种行为,而是希望能够选择名称(Y而不是X),甚至可以选择新方法,而不是像X(array).x()那样使用它。

有些人使用requireJs,但有些人不会。那么提供这种新功能的最佳做法是什么?如何避免名称冲突并使库易于使用?

有没有办法在不污染命名空间的情况下提供新功能,以便让用户将其分配给他想要的任何变量?

澄清:

让我们说我想在一个打印' hello world'的数组中添加一个方法。我可以提供一个全局变量' HelloWorldLibrary'然后用户可以将它绑定到他想要的任何方法。但这已经在全局命名空间中引入了一个名称。有没有办法避免它,或者是正确的方式,我应该这样做?

1 个答案:

答案 0 :(得分:0)

不,当前没有办法bind a method to an object in a scoped way,理由是它可以通过外部方法,使用自定义对象(而不是直接将其粘贴在Array或Object上)来完成,并且在运行时它很昂贵。

用例非常真实(为每个对象添加一个属性),有一个抽象引用提案正是这样做的 - 它现在被function bind提议取代了,ES7的建议语法看起来像这样:

function myNewMethod(x){
    alert(this.y + x);
}

var obj = {y: 5};
obj::myNewMethod(5); // logs 10

对于实际的模块管理 - 您可以将ES6模块与模块加载器API一起使用。 ES6模块(importexport关键字)允许您导入/导出内容而不会污染全局命名空间。 ES6之前的系统解决方案使用RequireJS等模块加载器和browserify等工具。