javascript 匿名函数作为对象方法
javascript anonymous function as object method
我有一个创建对象并计算一些属性的小函数
function MyArrayObj(array) {
this.array = array;
this.sorted = (function (arr) { return arr.sort(function(a, b) { return a - b }) })([...this.array]);
this.max = this.sorted.slice(-1).pop();
this.min = this.sorted[0];
this.sum = this.sorted.reduce(function(a, b) { return a + b; }, 0);
this.unique = [...new Set(this.sorted)];
}
我这样做的原因是我想在创建对象后立即准备好一切。
但是我有一个关于this.sorted
的问题:每次调用它的时候都会计算它的值吗?或者只有一次,当对象被创建时?
PS:我应该这样做吗?还是等到我真正需要 max
、min
等时才获取值会更好?
这里的sorted
不是函数,而是调用匿名函数function (arr) { return arr.sort(function(a, b) { return a - b }) }
的结果,值为[...this.array]
。所以它本身不是一个会被再次调用的函数
PS: should i be doing this? or would it be better to wait until i actually need max
, min
, etc. and only then get the values?
这当然取决于您的应用程序。如果您很可能从不 需要它们,那么等待可能是有意义的。但是如果你可能需要它们中的任何一个,特别是如果你要多次使用它们,那么,因为那里唯一昂贵的操作是 sorted
,无论如何它在其他一些人中使用,你可能最好提前做好。这样代码就干净多了。
但是说到干净的代码...如果您不需要此对象的原型(也就是说,您没有向此类型添加方法),那么使用工厂创建它可能会更干净函数(因此跳过 new
运算符。)这是一个版本:
const myArrayObj = (array, sorted = [... array].sort()) => ({
array,
sorted,
max: sorted[sorted.length - 1],
min: sorted[0],
sum: array.reduce((a, b) => a + b, 0),
unique: [... new Set(sorted)]
})
如果您不喜欢sorted
那样定义,那么您可以
const myArrayObj = (array) => {
const sorted = [... array].sort())
return {
array,
// ...
}
}
还有一点。如果你自己需要 sorted
,这很好。但是如果你想让 sorted
只得到 max
和 min
,那么执行 O(n * log(n))
操作来获取你可以在 [=25] 中收集的值确实效率低下=] 一个。根据您的数据,这可能永远不是问题,但值得考虑。
我有一个创建对象并计算一些属性的小函数
function MyArrayObj(array) {
this.array = array;
this.sorted = (function (arr) { return arr.sort(function(a, b) { return a - b }) })([...this.array]);
this.max = this.sorted.slice(-1).pop();
this.min = this.sorted[0];
this.sum = this.sorted.reduce(function(a, b) { return a + b; }, 0);
this.unique = [...new Set(this.sorted)];
}
我这样做的原因是我想在创建对象后立即准备好一切。
但是我有一个关于this.sorted
的问题:每次调用它的时候都会计算它的值吗?或者只有一次,当对象被创建时?
PS:我应该这样做吗?还是等到我真正需要 max
、min
等时才获取值会更好?
sorted
不是函数,而是调用匿名函数function (arr) { return arr.sort(function(a, b) { return a - b }) }
的结果,值为[...this.array]
。所以它本身不是一个会被再次调用的函数
PS: should i be doing this? or would it be better to wait until i actually need
max
,min
, etc. and only then get the values?
这当然取决于您的应用程序。如果您很可能从不 需要它们,那么等待可能是有意义的。但是如果你可能需要它们中的任何一个,特别是如果你要多次使用它们,那么,因为那里唯一昂贵的操作是 sorted
,无论如何它在其他一些人中使用,你可能最好提前做好。这样代码就干净多了。
但是说到干净的代码...如果您不需要此对象的原型(也就是说,您没有向此类型添加方法),那么使用工厂创建它可能会更干净函数(因此跳过 new
运算符。)这是一个版本:
const myArrayObj = (array, sorted = [... array].sort()) => ({
array,
sorted,
max: sorted[sorted.length - 1],
min: sorted[0],
sum: array.reduce((a, b) => a + b, 0),
unique: [... new Set(sorted)]
})
如果您不喜欢sorted
那样定义,那么您可以
const myArrayObj = (array) => {
const sorted = [... array].sort())
return {
array,
// ...
}
}
还有一点。如果你自己需要 sorted
,这很好。但是如果你想让 sorted
只得到 max
和 min
,那么执行 O(n * log(n))
操作来获取你可以在 [=25] 中收集的值确实效率低下=] 一个。根据您的数据,这可能永远不是问题,但值得考虑。