代码之家  ›  专栏  ›  技术社区  ›  Timothy

在构造函数中包装新内容是好是坏?

  •  6
  • Timothy  · 技术社区  · 16 年前

    我看了约翰·雷西格的 Best Practices in JavaScript Library Design 演示文稿;一张幻灯片建议“调整”对象构造函数,以便它实例化自己。

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

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

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

    过了一会儿,我在这读了一篇文章。(抱歉,我不记得是哪一个,否则我会提供链接。如果我能再找到这个问题,我会更新它。)其中一条评论说隐藏这个问题是不好的做法。 new 像这样的程序员,但没有详细说明。

    我的问题是,上面一般认为是好的,坏的,或是冷漠的,为什么呢?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Sean Kinsey    16 年前

    当人们忘记使用 new “class”函数前面的运算符。
    逻辑是如果调用函数时 新的 ,那么全局作用域仍然是当前作用域(而不是新实例),因此我们只使用 新的 操作员。

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

    但是,我猜这是根据jquery的咒语:
    “不允许用户编写质量代码,而是允许/强制用户编写不合理和无效的代码。”

        2
  •  4
  •   Community Mohan Dere    9 年前

    我认为这是一个实际的和完全有效的 防守技术 .

    如果你正在建造一个 constructor function ,确定要使用新创建的对象实例( this ) 没什么好东西 将发生如果 这 指向全局对象。

    幸运的是,在ECMAScript 5版中, 严格模式 , 这 只包含 undefined 当调用没有基对象或 new 操作员…

    参见:

        3
  •  1
  •   Tyler Carter    16 年前

    您正在从函数返回对象。我觉得没问题。

    这与执行以下操作相同:

    function getObject(){ return new SomeObject; }
    

    唯一的区别是你实际上是在回归自己。但是,如果你把它清楚地记录下来,就不会产生误导。那些习惯于jquery的人可能会称赞你提高了可用性。