new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?
Posted
技术标签:
【中文标题】new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?【英文标题】: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
运算符(以及为什么如果没有它调用构造函数,它们的行为很可能会有点奇怪)。
【参考方案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
将是 window
或 undefined
,具体取决于您是否在严格模式下。
b. return new ObjectID(id)
- 如果构造函数没有用new
调用,那么函数将返回new ObjectID(id)
。这意味着如果您在示例中调用ObjectId()
,该函数将检测到这一点并返回new ObjectID(id)
(或者如果没有给出id
,则返回new ObjectID()
),因此它与上述两个选项完全相同。
总之,没有功能上的区别,这取决于你喜欢怎么写。没有理由在功能上偏爱其中一个。
注意:ObjectID
和 ObjectId
是同一个东西。源代码声明: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。以上是关于new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose 在结果的 _id 字段中返回“new ObjectId”