数据函数应该是数据数组的属性吗?

时间:2017-08-21 18:29:44

标签: javascript arrays javascript-objects

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

我看到两个选项:

1。将数据定义为数组并将操作函数添加到数组中,这是可能的,因为数组是一种Object。

示例:

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,因此数据处理将变得冗长乏味。

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

随意提供更好的选择。

编辑:

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

在我看来,第二个选项更好,因为正如你所说,修改原生对象是一种不好的做法。

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

通过这种方式,您将能够创建同一类的多个实例。

class

相同的实施,但使用ES5

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

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