我正在构建一个库(https://github.com/OscarGodson/storageLocker),更准确的是localStorage包装器,但因为这是我第一次尝试使用OO JavaScript,我还在学习,我有一个几个问题。
我在其他库中看到,有时候它们会将它们包装在一个匿名函数中。我,或者我应该这样做吗?如果是这样,如何不破坏任何东西?
对于内部API(基本上是内部函数)我应该如何编写它们?应该将它们添加到主对象,例如我的脚本中随机storageLocker.prototype.myInternalFunction()
或只是myInternalFunction()
?我不希望这些函数是全局的......例如,其中一个函数只检查JSON中的一堆项,查看它们的对象,然后检查对象类型是什么(如Date()
然后转换它。
我应该如何/在哪里添加全局,我的脚本,变量?例如我有一个名为patterns
的变量,就像var patterns = {"date":/\/Date\(([0-9]+)\)\//}
我应该如何将其添加到我的脚本中?
非常感谢。我想以正确的方式编写我的脚本所以我问你们。我不知道当地的任何JS人员做过任何OO JS,他们都是老式的......
答案 0 :(得分:3)
我会说:
1)此技术的目的不是污染全局命名空间。这是一件好事。 在下面的示例中,您可以看到与库的所有交互都是通过一个对象MyLibrary进行的。公共API是匿名函数的返回值。
var MyLibrary = function() {
// private
this.InternalVariable = 'some value';
function internalFunction(x,y) {
return x + y;
}
function getInternalVariable() {
return this.InternalVariable;
}
// public
return {
publicVariable : '1.0',
publicFunction : function(x,y) {
return x + y
},
accessInternalVariable : function() {
return getInternalVariable();
}
}
}();
2)另见上面关于如何放置“内部”功能的例子
3)如果你的全局变量是某种配置选项,我只需要公开setter / getter并保持变量“private”
答案 1 :(得分:2)
http://nefariousdesigns.co.uk/archive/2010/10/object-oriented-javascript-follow-up-part-2-technical/
有一个值得一读的命名空间。
也是另一个很好的概述。
有关优秀JavaScript实践的更多精彩内容,请查看
在我们在评论中讨论后,我将示例更改为:
var storageLocker = function (selector) {
var _selector = selector || "default value";
function myPrivateFunction() {
}
var public = {
get: function () {
return _selector;
},
uppercase : function () {
_selector = _selector.toUpperCase()
return this;
}
}
return public;
};
// use:
var test = storageLocker("search for this").uppercase().get();;
alert(test);
虽然这不是库/模块的一个示例(因为您通过直接调用构造函数来访问代码),但它是将相同的对象保留在范围内以进一步链接方法的示例。实际上它没有返回storageLocker
对象,而是返回'public'对象,但是该对象可以通过关闭访问storageLocker
的范围。
可能还有其他更好的方法可能会返回storageLocker
对象本身,但这需要更多思考。