【问题标题】:What is the difference between new ObjectId() and new ObjectId and ObjectId()?new ObjectId() 和 new ObjectId 和 ObjectId() 有什么区别?
【发布时间】:2017-10-31 03:35:11
【问题描述】:

假设我在一个文件的开头有这个定义:

const ObjectId = mongoose.Types.ObjectId;

你应该更喜欢哪一个?为什么?

// 1 
new ObjectId;  

// 2
new ObjectId();

// 3
ObjectId();

官方文档建议使用new ObjectId。对我来说new ObjectId() 感觉更自然,但它们中的每一个都会生成一个新的 ObjectId,我在 SO 的问题和答案中看到了它们中的每一个的示例。

http://mongoosejs.com/docs/api.html#types-objectid-js

更新: 让我澄清一下:我知道为什么以及如何在 JavaScript 中使用 new 运算符,我只是想知道当 new 用于 ObjectID 生成时是否有任何显着差异。 (函数行为不同,抛出错误等......)

【问题讨论】:

  • MDN 很好地解释了 new 运算符(以及为什么如果没有它调用构造函数,它们的行为很可能会有点奇怪)。

标签: javascript node.js mongodb mongoose


【解决方案1】:

这些实例之间的差异绝对为零。让我通过每一种方式来解释它是如何工作的:

  • new ObjectId - 这完全没问题,与new ObjectId(); 做同样的事情,因为如果构造函数不带任何参数,您可以不带括号进行实例化,请参阅the MDN documentation 上的new 运算符

  • new ObjectId() - 这是实例化对象的“标准”方式,等效于new ObjectId

  • ObjectId() - 这与上述两个完全相同。这是因为source code中的那一行:

    if(!(this instanceof ObjectID)) return new ObjectID(id);
    

    上面的代码做了以下事情:

    一个。 !(this instanceof ObjectID) - 检查 this 是否是 ObjectID 的实例。这只有在使用 new 调用构造函数时才为真,其中 this 将引用当前实例,否则 this 将是 windowundefined,具体取决于您是否在严格模式下。

    b. return new ObjectID(id) - 如果构造函数没有new调用,那么函数将返回new ObjectID(id)。这意味着如果您在示例中调用ObjectId(),该函数将检测到这一点并返回new ObjectID(id)(或者如果没有给出id,则返回new ObjectID()),因此它与上述两个选项完全相同。

总之,没有功能上的区别,这取决于你喜欢怎么写。没有理由在功能上偏爱其中一个。


注意:ObjectIDObjectId 是同一个东西。源代码声明:var ObjectId = ObjectID;

【讨论】:

  • 感谢您详细说明。唯一无效的,至少在 Node.JS 中测试 mongodb 之后是 ObjectId 无效。 Mongodb包"mongodb": "^2.2.30"这里只接受ObjectID(ID大写):否则你会得到这个错误:node_modules\mongodb\lib\mongo_client.js:429 throw err ReferenceError: ObjectId is not defined。正如您所说,这两种语法都可以使用 ObjectID()new ObjectID()
  • @JuniorM 我说的是 Mongoose,而不是一般的 MongoDB。 Mongoose 公开 ObjectId 和 ObjectID。
猜你喜欢
  • 2018-02-13
  • 2016-04-28
  • 2018-04-30
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多