我用vanilla javascript和jquery完成了相当多的工作。我正在尝试编写一个应用程序,它现在使用某种形式的闭包来私有化方法,这样一切都不只是在公共命名空间中。
我转向模块模式,因为它似乎是我的问题的解决方案,但是我不能完全围绕它。当您使用此模式将方法添加到主应用程序时,是否所有模块都可以使用其他模块中的所有方法?因为,情况似乎并非如此。
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {
// ...
}
my.moduleProperty = 1;
my.moduleMethod = function () {
console.log("Method 1!");
};
my.anotherMethod(); //This doesn't work. anotherMethod() not defined
return my;
}());
var MODULETWO = (function (my) {
my.anotherMethod = function () {
console.log("Method 2!");
};
my.moduleMethod();
my.anotherMethod();
return my;
}(MODULETWO));
出于某种原因,我希望评论的方法能够发挥作用。我们能做到这一点吗?我设想有一个应用程序的app.js,其他单独的js文件具有实用程序功能来帮助该应用程序,但在很多情况下,我设想那些需要访问主应用程序范围的实用程序类。我似乎无法得到那个......
思想?
我接触过的人向我指出了Browserify.js,但我不知道这是否解决了我通过闭包无法访问所有内容的要求。它看起来就像一个捆绑应用程序。
答案 0 :(得分:0)
您的问题是您不遵守面向对象的设计规则。有各种各样的范例,更多的书籍,博客和视频,你可以在10生命中消费。我个人推荐OOP的SOLID原则。
更具体地说,您的模块应该作为封装单元。模块应该具有单一的逻辑责任,应该通过其公共方法公开。如果您需要访问其私有方法,则存在设计问题。
答案 1 :(得分:0)
adhoc模块模式为您提供了一种通过在函数内部包含值来创建隐私的方法,从而为闭包创建。
这样想:
如果在函数内部声明变量,则只能在该函数中访问它,除非您公开它。
未曝光,_foo只是坐在那里等待垃圾收集
var foo = function() {
_foo = {name: 'joe', age: 42};
};
var myFoo = new foo();//this is undefined as we return nothing
暴露,名称暴露但年龄不大,您无法直接访问_foo。在下面的代码中,年龄是无用的,因为它无法达到。
var foo = function() {
_foo = {name: 'joe', age: 42};
var api = {
getName: function() {
return _foo.name;//api can return this because _foo is still in scope
}
};
var myFoo = new foo();//this is an object with one method, getName (it is the api returned from foo).
如果你创建另一个构造函数bar,它将无法与_foo交互,因为它被困在myFoo中。 bar的api只能访问其中定义的变量,在本例中为_bar。
var bar = function() {
_bar = {name: 'mike', age: 4};
var api = {
getName: function() {
return _foo.name;
},
getAge: function() {
return _bar.age
hasBirthday: function() {
_bar.age++;
return _bar.age;//bumps the age and returns the new age.
}
};
通知栏充分利用了私人数据,添加setter可能是个好主意。
这种模式提供了隐私,您构建应用程序的架构完全取决于您。
查看本书,了解有趣的Javascript模式的全面示例:https://addyosmani.com/resources/essentialjsdesignpatterns/book/