【问题标题】:Is wrapping new within the constructor good or bad?在构造函数中包装 new 是好是坏?
【发布时间】:2011-02-20 05:48:45
【问题描述】:

我观看了 John Resig 的 Best Practices in JavaScript Library Design 演讲;一张幻灯片建议“调整”对象构造函数,使其实例化自己。

function jQuery(str, con) {
    if (window === this) {
        return new jQuery(str, con);
    }
    // ...
}

这样,new jQuery("#foo") 就变成了jQuery("#foo")

我觉得这很有趣,但我还没有在自己的代码中编写过这样的构造函数。

稍后,我在这里阅读了关于 SO 的帖子。 (抱歉,我不记得哪个或我会提供链接。如果我能再次找到它,我会更新问题。)其中一个 cmets 说,像这样对程序员隐藏 new 是不好的做法,但没有详细说明。

我的问题是,以上一般认为是好的、坏的或无关紧要的,为什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    当人们忘记在“类”函数前使用new 运算符时,这是一种防御技术。
    逻辑是,如果在没有new 的情况下调用函数,那么全局作用域仍将是当前作用域(而不是新实例),因此我们只需使用new 运算符调用相同的函数。

    但如果你问我,正确的做法是抛出一个错误并让开发人员知道它犯了一个错误,而不是仅仅“接受”它。

    但是,我猜它是根据 jQuery 口头禅:
    '不是让用户编写高质量的代码,而是启用/强制他们编写不合逻辑和无效的代码'。

    【讨论】:

      【解决方案2】:

      IMO 我认为这是一种实用且完全有效的防御技术

      如果你正在构建一个constructor function,肯定要使用新创建的对象实例(this),如果this 指向全局对象,没有任何好处 .

      幸运的是,在严格模式的 ECMAScript 5 版本中,当调用一个没有基对象或 new 运算符的函数时,this 将仅包含 undefined。 .

      另见:

      【讨论】:

        【解决方案3】:

        您正在从函数返回一个对象。我认为这没有问题。

        和做的一样:

        function getObject(){ return new SomeObject; }
        

        唯一的区别是您实际上是在返回自己。但是,如果你清楚地记录它,它似乎并没有误导。习惯 jQuery 的人可能会称赞您增加了可用性。

        【讨论】:

          猜你喜欢
          • 2018-07-30
          • 1970-01-01
          • 2011-01-09
          • 1970-01-01
          • 2021-12-13
          • 1970-01-01
          • 2011-04-30
          • 2013-09-16
          • 2018-12-09
          相关资源
          最近更新 更多