我可以将函数的声明与赋值运算符结合起来吗?我知道会立即调用函数表达式,但我不确定这种方法是否会像调用新运算符一样。
如果可以将其组合在一起,它将节省相当多的代码行。函数总是只实例化一次并分配给命名空间变量,因此如果不需要,就不需要将它们作为单独的语句。
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();
为什么不创建一个对象文字?
app.form.mobile.internalLogin = {
initializeForm: function() {
}
};
它也会做同样的事情。
编辑:贝吉是对的。从技术上讲,这并不起同样的作用。使用此解决方案,您不需要在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;
})();
http://jsfiddle.net/9kgvj2dd/
不过,我刚刚意识到,如果你要使用上面的例子,你就不会使用单词"private"one_answers"public",因为它们自ES2以来一直是保留单词,而且随着ES6中类的引入,你真的不想制造可能存在的冲突。