我使用 javascript 已有一段时间了,并且创作了我的第一个内容,并已被其他人使用。
主要 react 是我的内容不能很好地与其他代码兼容。
不幸的是,javascript 没有很多用于创建非冲突库的常规工具,如 namespace 和类。
那么用JS编写无冲突库的基本标准和工具是什么?
最佳答案
Javascript 是一种美丽而破烂的编程语言。许多来自其他语言的程序员经常发现它的本质相当令人困惑,如果不是非常烦人的话。
Javascript 缺少许多经典语言用来创建干净类和接口(interface)的工具。但这并不意味着你不能用 JS 写出很棒的库,它只是意味着你需要学习如何使用它提供的工具。
IMO 关于良好模块化代码主题的最佳资源是:
道格拉斯克罗克福德的:javascript the good parts
Paul Irish 的: 10 things I learned from the jQuery Source
在所有这些中,代码冲突问题通过至少以下两种做法得到解决。
IFFE 包装器
(function(dependency , undefined ) {
...dostuff...
})(dependency)
将您的图书馆包装在 IFFE 中非常有用,因为它立即生成 closure .这可以防止您过度填充全局命名空间。
另外:上面的代码将库dependencies
作为参数传入。这既提高了性能,又减少了副作用。例如 jQuery 通过以下方式传入窗口:(function(window){})(window)
最后但同样重要的是,我们添加但未定义参数undefined
。这通常被称为白痴测试。如果有人在他们的代码中的其他地方更改了 undefined
,它很容易给您的库带来各种麻烦。 (function(undefined) {})()
通过“未定义 undefined”修复此问题,从而使其按预期工作。
冲突处理器
var _myLibrary = window.myLibrary;//Backs up whatever myLibrary's old value was
myLibrary = function(){...dostuff...};
myLibrary.prototype = {
getConflict : function() {
return window.myLibrary === myLibrary ?
_myLibrary || false : false;
};
}
当您不知道您的库将与哪些其他库一起使用时,冲突方法非常重要。上面的方法类似于jQuery的'noConflict'。
简而言之,getConflict
返回覆盖的 myLibrary 变量。如果没有任何内容被覆盖,则返回 false。
让它返回 false 非常有用,因为它可以像这样用在 if
语句中。
if(myLibrary.getConflict()){
var foo = Object.create(myLibrary.getConflict());
}
关于javascript - 编写可重用的 javascript 模块和库。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116439/