为什么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文档,点击连接示例底部的“查看代码”:
相关文档