tou*_*ano 31 javascript performance node.js javascript-objects
我正在构建request模块的复合,但是我不确定在JS for Node中构建对象的最佳实践是什么.
选项1:
function RequestComposite(request) {
return {
get: function (url) { return request.get(url); }
}
}
var comp = RequestComposite(request);
Run Code Online (Sandbox Code Playgroud)
选项2:
function RequestComposite(request) {
this.request = request;
}
RequestComposite.prototype.get = function (url) { return this.request.get(url); };
var comp = new RequestComposite(request);
Run Code Online (Sandbox Code Playgroud)
选项3:
var RequestComposite = {
init: function (request) { this.request = request; },
get: function (url) { return request.get(url); }
}
var comp = Object.create(RequestComposite).init(request);
Run Code Online (Sandbox Code Playgroud)
我试图找到自己的方式,但是我对如何使用对象更加困惑...
如果我想为浏览器使用对象,答案会有所不同吗?
谢谢.
bgu*_*ach 46
最有效的方法如下:
仅在构造函数中设置属性.
.prototype在构造函数的属性中设置方法.为什么?因为这可以防止每次创建对象时重写每个方法.这样,您可以为您创建的每个对象回收相同的原型.高效的记忆和时间.
不要将封闭用于私有财产.为什么?:它很慢,并阻止您在继承链中使用此对象(伪私有变量不属于对象,它们只是可访问).请使用下划线表示它是不应从外部访问的私有属性.
用new而不是Object.create.它更快,最后Object.create new在引擎盖下使用.
换句话说,这样的事情:
var Person = function (name) {
this._name = name;
};
Person.prototype.sayHello = function () {
alert('My name is: ' + this._name);
};
var john = new Person('John');
john.sayHello();
Run Code Online (Sandbox Code Playgroud)
一些额外的信息:
Object.create vs new.这里是基准.虽然问题是针对node.js,但我认为可以预期相同的行为.(欢迎任何更正)
用于模拟私有属性的闭包:您可以在此问题中阅读..private/closure属性不属于该对象的点是编程事实:它们可由对象方法访问,但不属于该对象.使用继承时,这是一个很大的混乱.此外,只有在构造函数中声明的方法才能访问闭包.原型中定义的方法没有.
三年前我在这里提出的观点仍然是从表现的角度来看,但我对"推荐方式"的看法在一段时间内发生了一些变化.工厂功能通常是一个很好的选择,这将是OP的第一种方法.举个例子:
function Person(name) {
return {
sayHello: function () { alert('My name is: ' + name); }
};
}
Run Code Online (Sandbox Code Playgroud)
然后就是:
var p = Person('John');
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以为某些速度和内存交换灵活性(无Object.create耦合,易于与其他"混合"组合)和简单(没有new混乱,简单的对象实例化).一般来说,它们完全有效.如果您遇到性能问题,并且这些是因为这种创建对象的方式,则还原为另一种方法.这种this方法也很好,不知何故落在中间Object.create和工厂函数中(旁注:新new语法是class+的语法糖new)
总结:我推荐的方法是从创建对象(工厂函数)的最简单和最简单的方法开始,然后在遇到性能问题时(在大多数情况下永远不会)落入其他方法.
在JS中有很多方法可以创建"Class"和"Object".我更喜欢这种方式:
var MyObject =
function(args) {
// Private
var help = "/php/index.php?method=getHelp";
var schedule = "/php/index.php?method=getSchedules";
var ajax = function(url, callback, type) {
//....
}
// Public
this.property = 0;
this.getInfo = function() {
// ...
}
// Constructor
function(data) {
this.property = data;
}(args);
};
var o = new MyObject();
Run Code Online (Sandbox Code Playgroud)