对象是否可以是未定义的但是具有已定义的属性? (JavaScript)的

时间:2015-04-29 04:59:50

标签: javascript express passport.js

我遇到一个与我遇到的简单Javascript函数有关的令人尴尬的问题:

Passport.prototype.use = function(name, strategy) {
  if (!strategy) {
    strategy = name;
    name = strategy.name;
  }
  if (!name) throw new Error('authentication strategies must have a name');

  this._strategies[name] = strategy;
  return this;
};

我认为此功能的目的是为策略提供name,覆盖它可能具有的默认名称。

我认为该功能的第一部分基本上是将strategy.name分配给name,前提是策略未定义if(!strategy){}。这对我来说并不直观。如果仅在未定义strategy.name的情况下运行此代码,如何定义strategy? IE浏览器。一个未定义的对象可以有一个已定义的属性 - 或者我不正确地看这个?

作为旁注 - 我一直在网上搜索试图找出整个javascript中_的用法。我知道underscore.js库非常受欢迎,但该库尚未加载,因此这个下划线必须表示其他内容。

无论如何,任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

为了组织起见,让我们将评论部分正式化(顺便说一下,为什么现在有很多人通过评论回答?)

参数重载

这是(不幸的是)在Javascript中很常见。它是一种为两个接口提供相同功能的方法。在我看来,这通常会导致混乱。

尽管如此,在这种情况下,作者想要提供两个签名:

Prototype.use(strategy: Object)

Prototype.use(name: String, strategy: String)

允许来电者:

Passport.use("name", "strategy");

Passport.use({ "name": "name" });

因此,如果第二个参数是假的(if (!strategy)),那么请改用第一个参数(strategy = name;)。

"""私人"""变量

Javascript缺乏"私有"变量(闭包除外)所以使用下划线为_property添加前缀表示它不应被外部代码访问,即"使用你自己的危险,可能会破坏"。