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

时间:2017-05-30 15:14:23

标签: javascript node.js mongodb mongoose

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

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用于ObjectID生成时是否存在任何显着差异。 (函数表现不同,抛出错误等...)

2 个答案:

答案 0 :(得分:4)

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

  • 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) - 检查thisObjectID的实例。如果使用new调用构造函数,其中this将引用当前实例,或者this将为window或者undefined,则仅为真 return new ObjectID(id)取决于您是否处于严格模式。

    new - 如果使用new ObjectID(id)调用构造函数 ,则函数将返回ObjectId()。这意味着如果您在示例中调用new ObjectID(id),该函数将检测到此情况并返回id(或者如果未new ObjectID(),则ObjectID),因此它完全相同如上两个选项。

总之,没有任何功能差异,只是你喜欢写它。在功能上没有理由比其他人更喜欢。

注意:ObjectIdvar ObjectId = ObjectID;是一回事。源代码指出:Runtime.exec()

答案 1 :(得分:-3)

这类似于Javascript Date对象。但是,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