我一直在使用javascript,并撰写了我的第一个已被其他人使用过的内容。
主要的反应是我的内容与其他代码不相符。
不幸的是,javascript没有很多用于创建非冲突库的常规工具,就像名称空间和类一样。
那么在JS中编写非冲突库的基本标准和工具是什么?
答案 0 :(得分:4)
Javascript是一种美观且破碎的编程语言。许多来自其他语言的程序员经常发现它的性质非常令人困惑,如果不是令人讨厌的话。
Javascript缺少很多古典语言用来创建干净的类和接口的工具。但这并不意味着您无法在JS中编写出色的库,只是意味着您需要学习如何使用它提供的工具。
IMO关于良好模块化代码主题的最佳资源是:
Douglas Crockford's:javascript the good parts
Paul Irish's: 10 things I learned from the jQuery Source
在所有这些问题中,代码冲突的问题通过至少以下两种做法来解决。
(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());
}