编写可重用的javascript模块和库。

编写可重用的javascript模块和库。,javascript,jquery,module,functional-programming,libraries,Javascript,Jquery,Module,Functional Programming,Libraries,我已经使用javascript有一段时间了,并且已经编写了我的第一个被其他人使用的内容 主要的反应是,我的内容与其他代码的配合不好 不幸的是,javascript并没有很多用于创建非冲突库的常规工具,比如名称空间和类 那么,在JS中编写无冲突库的基本标准和工具是什么 Javascript是一种漂亮的、不完整的编程语言。许多来自其他语言的编程人员经常发现它的本质非常令人困惑,甚至令人讨厌 Javascript缺少许多古典语言用来创建干净类和接口的工具。但这并不意味着你不能用JS编写优秀的库,它只是

我已经使用javascript有一段时间了,并且已经编写了我的第一个被其他人使用的内容

主要的反应是,我的内容与其他代码的配合不好

不幸的是,javascript并没有很多用于创建非冲突库的常规工具,比如名称空间和类

那么,在JS中编写无冲突库的基本标准和工具是什么


Javascript是一种漂亮的、不完整的编程语言。许多来自其他语言的编程人员经常发现它的本质非常令人困惑,甚至令人讨厌

Javascript缺少许多古典语言用来创建干净类和接口的工具。但这并不意味着你不能用JS编写优秀的库,它只是意味着你需要学习如何使用它提供的工具

IMO关于良好模块化代码主题的最佳资源包括:

道格拉斯·克罗克福德:

好的:

保罗·爱尔兰:

在所有这些方法中,冲突代码的问题至少通过以下两种实践来解决

IFFE包装 将您的库包装在中非常有用,因为它可以生成一个立即名称空间。这可以防止您过度填充全局名称空间

另外:上面的代码作为参数传入库依赖项。这既提高了性能,又减少了副作用。例如,jQuery通过:functionwindow{}window传入窗口

最后但并非最不重要的一点是,我们添加但不定义未定义的参数。这通常被称为白痴测试。如果有人在代码的其他地方更改了未定义的代码,那么很容易给您的库带来各种各样的麻烦。functionundefined{}通过不定义undefined来修复此问题,从而使其按预期工作

冲突处理者 当您不知道您的其他库将与哪些库一起使用时,冲突方法非常重要。上述方法类似于jQuery的“noConflict”

简而言之,getConflict返回被覆盖的myLibrary变量。如果未覆盖任何内容,则返回false

让它返回false非常有用,因为它可以在类似这样的if语句中使用

 if(myLibrary.getConflict()){
     var foo = Object.create(myLibrary.getConflict());
 }

Javascript是一种漂亮的、不完整的编程语言。许多来自其他语言的编程人员经常发现它的本质非常令人困惑,甚至令人讨厌

Javascript缺少许多古典语言用来创建干净类和接口的工具。但这并不意味着你不能用JS编写优秀的库,它只是意味着你需要学习如何使用它提供的工具

IMO关于良好模块化代码主题的最佳资源包括:

道格拉斯·克罗克福德:

好的:

保罗·爱尔兰:

在所有这些方法中,冲突代码的问题至少通过以下两种实践来解决

IFFE包装 将您的库包装在中非常有用,因为它可以生成一个立即名称空间。这可以防止您过度填充全局名称空间

另外:上面的代码作为参数传入库依赖项。这既提高了性能,又减少了副作用。例如,jQuery通过:functionwindow{}window传入窗口

最后但并非最不重要的一点是,我们添加但不定义未定义的参数。这通常被称为白痴测试。如果有人在代码的其他地方更改了未定义的代码,那么很容易给您的库带来各种各样的麻烦。functionundefined{}通过不定义undefined来修复此问题,从而使其按预期工作

冲突处理者 当您不知道您的其他库将与哪些库一起使用时,冲突方法非常重要。上述方法类似于jQuery的“noConflict”

简而言之,getConflict返回被覆盖的myLibrary变量。如果未覆盖任何内容,则返回false

让它返回false非常有用,因为它可以在类似这样的if语句中使用

 if(myLibrary.getConflict()){
     var foo = Object.create(myLibrary.getConflict());
 }
 if(myLibrary.getConflict()){
     var foo = Object.create(myLibrary.getConflict());
 }