为什么mongoose.connect()在没有作为mongoose对象的方法时工作得很好?

给出以下代码:

var mongoose = require("mongoose"); console.log(mongoose); mongoose.connect("my database url here") 

如何一切正常工作 – 但mongoose对象没有任何connect()方法连接到它? 这里是console.log打印:

 Mongoose { connections: [ NativeConnection { base: [Circular], collections: {}, models: {}, config: [Object], replica: false, hosts: null, host: null, port: null, user: null, pass: null, name: null, options: null, otherDbs: [], _readyState: 0, _closeCalled: false, _hasOpened: false, _listening: false } ], plugins: [], models: {}, modelSchemas: {}, options: { pluralization: true } } 

不要误解我的意思,我喜欢魔术 – 但不是当我试图深入理解整个意思是如何融合在一起时。 我没有错误的事实这次没有帮助我。 我所知道的 – 应该是这样的:

 var myObj = { someMethodLikeConnect: function(nonBoringParameter){ //and now this is a method. } } console.log(myObj); // it prints corectly myObj.someMethodLikeConnect("foo"); // this works and it's expected. myObj.connect("some URL"); // this gives: "myObj.connect is not a function" Error and it's also expected. 

有没有像原型inheritance正在进行? 我的意思是这个connect()方法在mongoose对象上不存在,但是来自另一个更高层次的事物(由节点上下文或者smth构build),因为一些节点如何识别我们正在使用“mongoose”模块而不是“myObj”? ) – >这就是为什么它没有被我的控制台logging? 或者我从根本上错失了JavaScript的工作原理?

这是一个nodejs应用程序 – 我使用Cloud9。 我也是编程新手。 坦克你花时间来读这:)

你的预感是正确的,这里有原型inheritance。

以下是connect方法的代码:

 Mongoose.prototype.connect = function() { var conn = this.connection; if (rgxReplSet.test(arguments[0]) || checkReplicaSetInUri(arguments[0])) { return new MongooseThenable(this, conn.openSet.apply(conn, arguments)); } return new MongooseThenable(this, conn.open.apply(conn, arguments)); }; Mongoose.prototype.connect.$hasSideEffects = true; 

当你单独loginMongoose对象时,它只会在这个对象内部有什么,而不是它的原型。

现在如果你实例化一个新的Mongoose对象并logging下来? 它会有相关的function。

看看这个快速的JSBin,我看到了我的意思: JSBIN LINK

请注意这里的Mongoose文档,点击连接示例底部的“查看代码”:

相关文档