不要扩展任何对象的原型,尤其是原生对象.如果你不遵守这条规则,地狱里有一个特殊的地方在等你.
这篇文章也让我质疑原型的用途.如果您稍后要在代码中添加方法,为什么不在原始构造函数中添加它?
那么,何时需要扩展对象的原型?
我一直在学习Node.js所以我决定建立一个简单的广告网络,但我似乎无法决定要使用的数据库.我一直在使用Redis,但我似乎找不到按特定条件查询数据库的方法,而是只能获取键或列表的值或设置在键内.
我错过了什么,或者我应该使用像MongoDB这样更强大的数据库?
我今天发现了一些非常奇怪的事情:如果使用构造函数和new
关键字创建对象,但是return
构造函数中的函数,它的行为如下:
this
在构造函数中维护引用,则this
引用从构造函数正确创建的对象.这是你期望从中返回的new
.这是一个例子:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您像这样实例化:var instance = new Constructor()
将产生以下结果:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
Run Code Online (Sandbox Code Playgroud)
所以我猜我有三个问题:
在Node.js中,最好为每个单独的HTTP请求或用户执行createClient(),还是最好为所有请求重用相同的客户端?你还只用一个来获得几个并行客户端的速度吗?
我读到node.js是单线程的,因此它不会为每个http请求分叉新进程或启动新线程.但是http模块在关闭每个连接后是否有清理方法呢?例如,如果我在每次有人请求页面时在回调内创建一个对象,那么一旦响应被提供并且连接被关闭,该对象是否会被销毁?
我一直在玩EventEmitter,但我对如何从模块中实现它感到困惑.我见过几种不同的方式,它们似乎都有效.以下是我见过的一些内容:
从这里:
var Twitter = function() {...};
Twitter.prototype = new events.EventEmitter;
Run Code Online (Sandbox Code Playgroud)
但是在"掌握节点"中他们这样做:
function Dog(name) {
this.name = name;
EventEmitter.call(this);
}
Dog.prototype.__proto__ = EventEmitter.prototype;
Run Code Online (Sandbox Code Playgroud)
(为什么你需要.call它?)
然后在我自己的代码中我尝试了另一种方式:
function Class() {}
Class.prototype = EventEmitter.prototype;
Run Code Online (Sandbox Code Playgroud)
它们都是以自己的方式继承EventEmitter,所以最简单的解决方案不是最好的吗?
我正在使用 Connect.js 和 connect-session 模块来管理会话 cookie。我注意到 Connect 在除静态文件之外的所有路由上设置了一个会话 cookie。问题是我在发送之前处理了一些静态文件,比如 JS 和 CSS 文件,所以我不能使用 Connect 的内置静态服务器,这意味着 connect-session 为这些文件设置了一个会话 cookie。由于这些文件将包含在外部站点中,因此我不希望他们随同发送 cookie。
是否可以仅为特定路由设置会话 cookie?