假设我在文件的开头有这个定义:
const ObjectId = mongoose.Types.ObjectId;
您更喜欢哪一个?为什么?
// 1
new ObjectId;
// 2
new ObjectId();
// 3
ObjectId();
官方文件建议使用new ObjectId
。对我来说new ObjectId()
感觉更自然,但每个人都会产生一个新的ObjectId,我在SO的问题和答案中看到了每个人的例子。
更新
让我清楚一点:我知道为什么以及如何在JavaScript中使用新的运算符,我只是想知道当new
用于ObjectID生成时是否存在任何显着差异。 (函数表现不同,抛出错误等...)
答案 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)
- 检查this
是ObjectID
的实例。如果使用new
调用构造函数,其中this
将引用当前实例,或者this
将为window
或者undefined
,则仅为真 return new ObjectID(id)
取决于您是否处于严格模式。
湾new
- 如果使用new ObjectID(id)
调用构造函数 ,则函数将返回ObjectId()
。这意味着如果您在示例中调用new ObjectID(id)
,该函数将检测到此情况并返回id
(或者如果未new ObjectID()
,则ObjectID
),因此它完全相同如上两个选项。
总之,没有任何功能差异,只是你喜欢写它。在功能上没有理由比其他人更喜欢。
注意:ObjectId
和var 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