在Eloquent JavaScript第6.3章中,有一个序列接口问题。在解决方案中,我们有一个“make”函数,它是一个名为ArraySeq2的构造函数的函数。代码为ArraqySeq2.make
。
我的问题是,为什么我们不能将此函数设置为ArraySeq2原型的一部分?为什么ArraySeq2.prototype.make
不起作用?
下面的问题和完整代码:
设计一个接口,在一个集合上抽象迭代 值。提供此接口的对象表示序列, 并且接口必须以某种方式使得使用的代码成为可能 这样的对象迭代序列,查看元素 价值由它组成,并有一些方法可以找出结束的时间 到达了序列。
指定界面后,尝试编写一个函数 logFive,它接受一个序列对象并在其上调用console.log 前五个元素 - 或更少,如果序列少于五个 元件。
然后实现一个包装数组并允许的对象类型ArraySeq 使用您设计的接口迭代数组。实行 另一个对象类型RangeSeq迭代一系列整数 (取而代之的是其构造函数的参数)。
function ArraySeq2(array, offset) {
this.arr = array;
this.offset = offset;
}
// this is the confusing part; "ArraySeq2.prototype.make" throws an error
ArraySeq2.make = function(array, offset) {
if (offset === undefined) {
offset = 0;
}
if (offset >= array.length) {
return null;
} else {
return new ArraySeq2(array, offset);
}
};
ArraySeq2.prototype.rest = function() {
return ArraySeq2.make(this.arr, this.offset + 1);
};
ArraySeq2.prototype.head = function() {
return this.arr[this.offset];
};
function logFive2(sequence) {
for (var i = 0; i < 5 && sequence != null; i++) {
console.log(sequence.head());
sequence = sequence.rest();
}
}
logFive2(ArraySeq2.make([1, 2]));
// → 1
// → 2
以下答案的一些解释,以帮助答案:
您可以公开获取当前元素的方法(不带 推进任何一个柜台)和另一个获得一个新的序列 表示当前元素之后的剩余元素(或特殊元素) 如果到达序列的末尾,则为value)。这很优雅 - 一个 序列值即使在使用后也会“保持自身”,因此可以 与其他代码共享,而不必担心会发生什么 它。不幸的是,在某种语言中,这种效率也有些低效 JavaScript因为它涉及到创建很多对象 迭代。
这种替代方法将空序列表示为null,和 给出非空序列两种方法:
head()返回序列开头的元素。
rest()返回序列的其余部分,如果没有元素,则返回null。
因为JavaScript构造函数不能返回null,所以我们添加一个make 函数构造这种类型的序列,构造一个 如果结果序列为空,则返回null。