【问题标题】:Is there a reason not to use `new Object()` in JavasScript?是否有理由不在 Javascript 中使用`new Object()`?
【发布时间】:2011-03-04 13:19:26
【问题描述】:

以下示例是 JavaScript 中创建和操作对象的一种方式,即使用 new Object() 语法。另一种方法是创建一个对象字面量。

我记得在某处读过,但现在找不到应该避免使用“new Object()”在 JavaScript 中创建对象的原因。

现在有理由在下面的代码中使用new Object() 吗?

<html>
    <head>
        <title>Test Page</title>
        <script type="text/javascript">
            window.onload = function() {

                var layout = new Object();
                layout.idCode = 'simple';
                layout.title = 'Simple Layout';
                layout.content = '';
                layout.width = 400;
                layout.display = function() {
                    return '<div style="background-color: #eee; width:'+this.width+'">'+this.content+'</div>'
                };

                layout.width = 200;
                layout.content = 'This is the new content';

                document.getElementById('output').innerHTML = layout.display();
            };
        </script>
    </head>
    <body>
        <div id="output"></div>
    </body>
</html>

【问题讨论】:

  • 没有理由不使用 new Object(),唯一的好处是使用 {} 可以减少代码,仅此而已
  • @KIvanov 更少的代码实际上是一个非常的好理由 :)
  • @Ivo 在这里,是的。一般来说,不一定。不要冒着让你的代码完全无法阅读的风险,因为你用有趣的符号和简短的非描述性标识符让它变得太深奥了。

标签: javascript


【解决方案1】:

只是有点丑。改为这样写:

window.onload = function() {

    var layout = {
        idCode:   'simple',
        title:    'Simple Layout',
        content:  '',
        width:    400,
        display:  function() {
            return '<div style="background-color: #eee; width:'+this.width+'">'+this.content+'</div>'
        },

        width:    200,
        content:  'This is the new content'
    };
    document.getElementById('output').innerHTML = layout.display();
};

做同样的事情。

【讨论】:

    【解决方案2】:

    不,没有理由,但这更简单(虽然等效):

    var layout = {
      idCode   : 'simple',
      title    : 'Simple Layout',
      content  : '',
      width    : 400
      // etc.
    }
    

    【讨论】:

      【解决方案3】:

      我无法想象这会导致任何问题,但如果它困扰您,您可以随时:

      var layout = {};
      

      但实际上并没有什么区别。

      【讨论】:

        【解决方案4】:

        除了上面是可怕的代码而且如果我不得不查看提交时永远不会进入代码库这一事实之外没有任何区别。

        11.1.5 对象初始化器

        语义
        产生式 ObjectLiteral: { } 的评估如下:
        1. 返回一个新对象,就像由表达式 new Object() 创建的,其中 对象是标准的内置 具有该名称的构造函数。

        更多无聊的细节请见the spec

        PS:new Object() 可能会快一点,但这完全取决于 JS 引擎。这是一个超乎寻常的纳米优化

        【讨论】:

        • -1 你没有解释为什么你认为这很可怕。你只是觉得丑,还是有其他顾虑?
        • 抱歉,但我认为现在文字和对象表示法在所有可能的方面都优于 OP 中的内容,这已经是非常明显了。但是,嘿,它是如此......不应该期待那么多。
        • @Tomalak Geret'kal 你写的是var temp = new String("") 还是var temp = ""var temp = new Array(1)var temp = []var temp = new Number(0)var temp = 0。这东西很明显。
        • @IvoWetzel:当然,这对你或我来说都是显而易见的,但你的回答应该帮助提出问题的人,而不是已经知道的人。
        • @Raynos:我想你的意思是new Array(0)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多