【问题标题】:Javascript 'property inheritance'Javascript'属性继承'
【发布时间】:2009-10-19 07:11:06
【问题描述】:

有没有办法为数组中的对象字面量指定公共元素?

例如:

var array = [ {key: "hi", label: "Hi", formatter:deleteCheckboxFormatter},
              {key: "hello", label: "Hello", formatter:deleteCheckboxFormatter},
              {key: "wut", label: "What?", formatter:deleteCheckboxFormatter}];

所有三个记录都使用相同的格式化程序。你会如何重构它?

【问题讨论】:

    标签: javascript object refactoring


    【解决方案1】:

    我想到了两个替代方案:

    具有公共字段默认值的辅助函数:

    function make(key, label) {
      return {'key': key, 'label': label, formatter:deleteCheckboxFormatter};
    }
    
    var array = [ make("hi",  "Hi"),
                  make("hello", "Hello"),
                  make("wut", "What?")];
    

    或者一个更通用的函数,它接受格式化程序属性的参数:

    function make (formatter) {
      return function (key, label) {
        return {'key': key, 'label': label, 'formatter':formatter};
      }
    }
    
    // a function to build objects that will have a 'fooFormatter'
    var foo = make('fooFormatter'); 
    
    var array = [ foo ("hi",  "Hi"),
                  foo ("hello", "Hello"),
                  foo ("wut", "What?")];
    

    我想到的最后一件事就是简单地遍历分配公共字段的数组:

    var array = [ {key: "hi", label: "Hi"},
                  {key: "hello", label: "Hello"},
                  {key: "wut", label: "What?"}];
    
    var i = array.length;
    while (i--) {
      array[i].formatter = 'deleteCheckboxFormatter';
    }
    

    我在这里使用了一个倒序的while循环,因为迭代的顺序并不重要而且这种类型的循环performs better

    【讨论】:

    • +1 表示远远超出职责范围。就个人而言,我会选择第一个或第二个选项
    【解决方案2】:
    var array = [ {key: "hi", label: "Hi"},
                  {key: "hello", label: "Hello"},
                  {key: "wut", label: "What?"}];
    
    for(var item in array)
      item["formatter"] = deleteCheckboxFormatter;
    

    【讨论】:

      【解决方案3】:

      您可以使用构造函数从中创建一个对象:

      function Obj(key, label){
        this.key = key;
        this.label = label;
        this.formatter = "deleteCheckboxFormatter";
      }
      var array = [ new Obj("hi", "Hi"),
                    new Obj("hello", "Hello"),
                    new Obj("wut", "What?") ];
      

      【讨论】:

        猜你喜欢
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 2020-01-25
        • 2013-09-04
        • 2013-03-05
        • 1970-01-01
        相关资源
        最近更新 更多