如何将函数声明和new运算符组合到一个语句

时间:2015-12-08 15:56:19

标签: javascript

我可以将函数声明与赋值运算符组合使用吗?我知道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();

1 个答案:

答案 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;
})();

http://jsfiddle.net/9kgvj2dd/

我刚刚意识到,如果您要使用上面的例子,那么您就不会使用“私人”字样。和公共'因为它们自ES2以来一直是保留字,并且随着ES6中的类的引入,你真的不想创建可能存在的冲突。