新的ObjectId()和新的ObjectId和ObjectId()之间有什么区别?

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

const ObjectId = mongoose.Types.ObjectId; 

你应该select哪一个?为什么?

 // 1 new ObjectId; // 2 new ObjectId(); // 3 ObjectId(); 

官方文档build议使用new ObjectId 。 对于我来说, new ObjectId()感觉更自然,但是每一个都会产生一个新的ObjectId,而且我已经在SO的问答中看到了每个对象的例子。

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

更新:让我明白这一点:我知道为什么以及如何在JavaScript中使用一个新的运算符,我只是想了解当new的ObjectID生成使用时,是否有任何显着的差异。 (该function行为不同,引发错误等…)

这些实例之间绝对没有差别。 让我通过各种方式来解释它是如何工作的:

  • new ObjectId – 这是完全好,做new ObjectId();相同的事情new ObjectId(); 因为如果构造函数没有使用任何参数,您可以在没有括号的情况下实例化,请参阅new运算符上的MDN文档

  • new ObjectId() – 这是实例化一个对象的“标准”方式,相当于new ObjectId

  • ObjectId() – 这和上面两个完全一样 。 这是因为源代码中的行:

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

    上面的代码执行以下操作:

    一个。 !(this instanceof ObjectID) – 检查this是否是ObjectID一个实例。 这只有在构造函数被调用时使用new才会引用当前实例,否则this将是windowundefined取决于您是否处于严格模式。

    return new ObjectID(id) – 如果构造函数没有new调用,那么函数将返回new ObjectID(id) 。 这意味着,如果你在你的例子中调用ObjectId() ,函数将检测到这个并返回new ObjectID(id) (或者如果没有给出idnew ObjectID() ),所以它是完全一样的上述两个选项。

总之,没有function上的差异,只是你喜欢写它而已。 没有理由比其他function更偏好一个。


注意: ObjectIDObjectId是一样的东西。 源代码状态如下: var ObjectId = ObjectID;

这与Javascriptdate对象类似。 但是,Date对象返回相同结果的稍微不同的变化。 例如:

 new Date(); // returns current date as object Date(); // returns current date as string 

在Javascript中实例化对象最常用的方法是通过显式调用构造函数,最后使用括号。

 new ObjectID(); 

无论您传递的参数是否保持一致。

最后,并不是所有的静态调用类都会返回可预测的结果。

 Array() // returns [] String() // returns "" Date() // returns current date as a string, not an object