如何将函数声明和新运算符组合为一条语句



我可以将函数的声明与赋值运算符结合起来吗?我知道会立即调用函数表达式,但我不确定这种方法是否会像调用新运算符一样。

如果可以将其组合在一起,它将节省相当多的代码行。函数总是只实例化一次并分配给命名空间变量,因此如果不需要,就不需要将它们作为单独的语句。

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中类的引入,你真的不想制造可能存在的冲突。

最新更新