我有一个数据集和一些操作该数据的函数。我想将数据和函数存储在一个易于阅读且易于使用的逻辑结构中,而又不违反良好实践。

我看到2个选项:

1.将数据定义为数组,然后将操作函数添加到数组中,这是可能的,因为数组是一种对象。

例:

var dataSet = [1, 2, 3, 4];

var dataSet.add = function (newData) {
    if (newData === badData) {
        console.log('bad data!');
        return;
    }
    dataSet.push(newData);
};


优点:更清洁,更易读,更易于使用

缺点:我们正在修改Array对象,这意味着它不会表现出预期的行为,因此我们不应该尝试复制该对象,例如,也不要记录这样做的事实,否则会导致其失去功能。



2.定义一个新的对象,并将数据连同所有操作功能一起定义为对象的属性。

例:

var dataSet = {
    data: [1, 2, 3, 4],
    add: function (newData) {
        if (newData === badData) {
           console.log('bad data!');
           return;
        }
        data.push(newData);
    }
};


优点:对象按预期方式工作,可以轻松复制,并且可以整齐地打包数据和功能。

缺点:不能通过简单地调用“ dataSet”将数据引用为对象的规范表示。在某些情况下,由于需要不断调用dataSet.data而不是仅调用dataSet,因此数据操作将变得乏味。

这2个选项中哪一个最好,为什么?今天使用的这些选项有哪些例子?

随时提供更好的选择。

编辑:

选项2a :(如果您有多个数据集,请使用原型)

选项3:根本不将数据附加到功能上。而是为函数对象之外的数据创建一个单独的数组,并将所有数据函数放入其自己的对象中。

谢谢!

最佳答案

我认为第二种方法更好,因为正如您所说,修改本机对象是一种不好的做法。

实际上,还有第三个选项,您可以创建一个class,它将获取本机数据结构并在其上公开方法。

这样,您将能够创建同一类的多个实例。

class DataSet {
   constructor(data) {
      this.data = data;
   }

   add(newData) {
      if (newData === badData) {
         console.log('bad data!');
         return;
      }
      data.push(newData);
    }
}


与ES5相同的实现

var DataSet = (function () {
   function DataSet(data) {
       this.data = data;
   }
   DataSet.prototype.add = function (newData) {
       if (newData === badData) {
           console.log('bad data!');
           return;
       }
       data.push(newData);
   };
   return DataSet;
}());

10-06 13:04
查看更多