在NodeJS中创建对象的推荐方法是什么?

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)
  • 注意:我知道我应该以异步方式调用CB,但为了便于解释,我将其返回...

选项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属性不属于该对象的点是编程事实:它们可由对象方法访问,但不属于该对象.使用继承时,这是一个很大的混乱.此外,只有在构造函数中声明的方法才能访问闭包.原型中定义的方法没有.

  • 在构造函数或prototype属性中定义方法:阅读此问题,并查看此基准

编辑15/04/2016

三年前我在这里提出的观点仍然是从表现的角度来看,但我对"推荐方式"的看法在一段时间内发生了一些变化.工厂功能通常是一个很好的选择,这将是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)

总结:我推荐的方法是从创建对象(工厂函数)的最简单和最简单的方法开始,然后在遇到性能问题时(在大多数情况下永远不会)落入其他方法.


ovn*_*nia 7

在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)

  • *"如你所知,js中没有构造函数"*JS中没有*类*,但每个函数都可以是*构造函数*函数.似乎没有必要使用`var __construct = function(o){o.property ++; }(this);`,因为它等同于`this.property ++;`,它看起来不太复杂. (7认同)
  • 为什么你喜欢这种方式?有哪些优点和缺点?它与问题中提到的方式相比如何?更具体地说:"私人建设者"有什么意义?据我所知,你只是立即执行一个函数并将`undefined`分配给`__construct`. (6认同)