我可以将函数声明与赋值运算符组合使用吗?我知道immediately invoked function expressions但是我不确定这种方法是否会像调用new运算符一样。
如果可以组合,它会节省很多行代码。该函数始终只实例化一次并分配给命名空间变量,因此如果不需要,则不需要将它们作为单独的语句。
function internalLoginMobileModule () {
var self = this;
self.initializeForm = function () {
//
};
return self;
};
app.form.mobile.internalLogin = new internalLoginMobileModule();
修改
对象初始化器非常干净,但在我的情况下太有限了。我需要词法范围提供的力量。存储在全局命名空间中的这些“模块”包含需要“私有”函数的操作,以及在模块中重用代码(即能够使用this/self
访问该对象内的方法。这是一个示例我演示了使用的模块(注意self
的使用,以及私有函数_setDefaultButtonForArea):
var UIHelperModule = function () {
var self = this;
self.getExtJsElementByName = function (name) {
// Find Ext JS by name
};
self.isExtJsElementEnabled = function (name) {
return !self.getExtJsElementByName(name).disabled;
};
function _setDefaultButtonForArea (areaName, areaId, buttonName) {
// Set Default Button
}
self.setDefaultButton = function (buttonName) {
_setDefaultButtonForArea(null, window.thisForm.id, buttonName);
};
self.setDefaultButtonForAreaName = function (areaName, buttonName) {
_setDefaultButtonForArea(areaName, null, buttonName);
};
self.setDefaultButtonForAreaId = function (areaId, buttonName) {
_setDefaultButtonForArea(null, areaId, buttonName);
};
self.triggerClickForElementName = function (buttonName) {
var foundExtJsElement = self.getExtJsElementByName(buttonName);
// Make sure the button exists
if (foundExtJsElement) {
foundExtJsElement.el.dom.click()
}
};
return self;
}
app.ui = new UIHelperModule();
答案 0 :(得分:4)
为什么不创建对象文字呢?
app.form.mobile.internalLogin = {
initializeForm: function() {
}
};
它正在做同样的事情。
编辑:Bergi是对的。这在技术上并没有做同样的事情。使用此解决方案,您不会在global
命名空间中存储任何内容,因为它总是存在破坏第三方脚本的风险。
并且您不会浪费资源来实例化您只会使用一次的对象。
此外,您不需要return this
将该功能作为对象进行评估。只需说this.initializeForm = function() {}
分配' initializeForm'到internalLoginMobileModule
的原型,所以在你的情况下你可以摆脱var self = this;
和return self;
行并仍然用new
实例化。
编辑#2,响应您的编辑: 你无法做任何事情来清理它,但不是很多,特别是如果你需要伪访问修饰符的话。
这就是我写它的方式,因为这看起来最好,这在大多数环境中都很重要,在这些环境中,可读性应该优于可写性。在JavaScript的情况下,编写难以阅读的代码非常容易。
以下代码是您几乎可以考虑的静态上下文,就像您说的那样是内联的。第一个代码示例可能看起来不太好看,但我可以看到在第二个示例中看起来好多了。
var myObject = (function() {
var private = {
privateMethod: function() {
console.log('privateMethod');
}
};
var public = {
initializeForm: function() {
private.privateMethod();
console.log('initializeForm');
}
};
return public;
})();
我刚刚意识到,如果您要使用上面的例子,那么您就不会使用“私人”字样。和公共'因为它们自ES2以来一直是保留字,并且随着ES6中的类的引入,你真的不想创建可能存在的冲突。