0

SO上可能有这个问题的副本,但我还没有找到一个专门解决我的问题的问题。

假设我正在构建一个包含以下内容之一的 Web 应用程序:

  1. 一个具有大约 100 个属性的 JS 对象,其中 5 个是子对象,可能有 10 或 15 个属性,每个属性大约 2/3 是函数。所以像:

    Obj={
        x:y,
        y:z,
        obj1:{
          func:func(),
          num:1,
          func2:func2()
        },
        obj2:etc
    }
    
  2. 或者几个不同的对象,其中仍然有一个具有 100 个左右的属性,但将运行函数的其他对象将存在于全局命名空间中,如下所示:

    Obj={
        x:y,
        y:z,
        etc:andthensome
     }
    obj1={
        func:func(),
        num:1,
        func2:func2()
    }
    obj2={
       etc:'I am also a larger objects with functions'
    }
    

第一种方法使全局命名空间更干净,但会导致更多的递归属性和函数搜索,并且可能会使保持this直线更加混乱。

第二种方式更容易理解,但会在全局命名空间中添加更多对象,并且执行速度可能会更慢(这就是问题类型)。

我的问题是,使用一种或另一种方式是否有任何显着的好处 - 或者它们都是“好”,都是“坏”?

我知道与开发人员的偏好有很大关系,所以用另一种方式问类似的问题——更接近我真正想知道的:

当使用许多较小的对象,或者一个或几个具有大量子对象和功能的大型对象等时,性能是否会受到更大的影响?

4

2 回答 2

2

更少的查找性能更高,但这并不重要。

您应该优化您的代码以便更易于维护,并且只有在性能成为问题时才担心性能。

更重要的是,如果性能已成为问题,请使用性能分析工具来查找代码中的瓶颈。

至于更多的全局污染,除非您明确希望它们存在,否则您永远不应该将对象添加到全局命名空间中。为避免污染,所有代码都属于立即调用函数表达式 (IIFE)

(function () {
    var obj = {
        foo: 'bar',
        ...
    };
}());
console.log(window.obj); //undefined, no accidental global pollution
于 2013-02-14T17:37:22.440 回答
0

查找不应该有任何显着的性能影响,代码结构与此无关。这些结构中的任何一个仍然只包含对对象的引用,无论如何,这些对象的查找时间都是相同的。

您应该构建对象以匹配您的数据并提高代码的清晰度。如果一个对象是与另一个对象分离的关注点,请不要将其设为属性。如果它直接相关,那么将它作为另一个对象的属性可能是有意义的。这里没有真正的性能问题,这是关于构建代码,使其可读、清晰且易于使用。

于 2013-02-14T17:03:04.153 回答