我有一个数据集和一些操作该数据的函数。我想将数据和函数存储在一个易于阅读且易于使用的逻辑结构中,而又不违反良好实践。
我看到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;
}());