【问题标题】:which way is correct? Javascript Objects (nodejs)哪种方式是正确的? Javascript 对象 (nodejs)
【发布时间】:2014-01-28 16:17:57
【问题描述】:

我喜欢 javascript 和 Node,但是当我声明对象时.. 我不知道什么是最佳实践和高性能。我对高性能感兴趣。

"use strict";

module.exports = SignUpBusiness;
SignUpBusiness.__proto__ = new SignUpBusiness;


function SignUpBusiness(){

    this._certificate   = null;
    this._db            = require('mongoose');
    this._model         = require('../models/User.js');
    this._userModel     = this._db.model('User', this._model.UserSchema);
    this._result        = false;

    this.runLoginProcess = function(credentials , next){
         //code
    }

    // etc.

}

或者这样:

"use strict";
module.exports = {

    _certificate   : null,
    _db            : require('mongoose'),
    _model         : require('../models/User.js'),
    _userModel     : this._db.model('User', this._model.UserSchema),
    _result        : false,


    runLoginProcess: function(credentials , next){
          //code
    }
    // etc.
}

非常感谢! 还有..对不起我的英语。

【问题讨论】:

  • 我更喜欢第一个,这样更容易获得正确的范围。
  • 你会创建这个对象一次还是多次?
  • 只创建一次并导出到 NodeJS 中的 module.exports。控制器调用业务层(这段代码)来执行复杂的流程。
  • Sergio 给出了迄今为止最好的答案:“视情况而定。”然而,(没有冒犯塞尔吉奥)这比他写的要多。所以没有一种方法是正确,而另一种不正确。我已经使用了这两种方法,具体取决于上下文。 (我说两者都不正确,但问题中出现的两个示例当前都包含有问题或完全错误的代码。例如,第二个示例中的this._db.model('User', this._model.UserSchema) 没有做任何明智的事情。)
  • “视情况而定”的答案并不好,总有更好的办法。也许问题是我没有给出关于代码操作的一些细节。对不起。我喜欢这 2 种方式,但我正在寻找的是最佳性能而不牺牲美观且可理解的代码。为什么有问题的代码行? @路易斯

标签: javascript node.js javascript-objects ecmascript-5


【解决方案1】:

使用原型(首选)是最好的方法。原型是最佳实践,可减少内存消耗(否则您将在每个新对象上重新声明内存)。

根据 Louis 的说法,以上内容可能不准确:

如果将模块的导出分配给 foo,则定义了 foo.proto._proto_.proto,但 foo.proto._proto_.proto._proto_ 不是。第二个选择的深度为 1: foo.proto 已定义但没有更深。第一种情况不仅占用更多内存,而且速度也较慢,因为字段查找必须遍历更深的链。

我现在无法测试我自己的答案。我稍后会尝试。

【讨论】:

  • 视情况而定。有理由使用其中任何一个,特别是如果您的对象将是单例,则内存问题无关紧要。也就是说,如果您不能立即直观地做出应该做出的选择,请使用原型方法,它更灵活,并且会教您如何以及何时做出选择。
  • 第一个选择的定义方式有 3 个对象的深度。也就是说,如果模块的导出分配给foo,那么foo.__proto__.__proto__.__proto__ 被定义,但foo.__proto__.__proto__.__proto__.__proto__ 没有被定义。第二个选项的深度为 1:foo.__proto__ 已定义但没有更深。第一种情况不仅占用更多内存,而且也更慢,因为字段查找必须遍历更深的链。 (即使是名字点击也会变慢,但这个评论的解释太长了。)
  • 三个物体的深度是怎么分配的?
  • 这就是 JavaScript VM 的构造方式。在 Node.js 中尝试一下。
  • 午饭后我就可以测试了。在那之前,我会在我的回答中记下它。如果您想详细解释名称命中和字段查找将如何变慢,请随时发布答案。
猜你喜欢
  • 2012-03-03
  • 2022-11-17
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多