Eloquent JavaScript 6.3(序列接口)原型和构造函数

时间:2016-12-25 05:54:56

标签: javascript function methods constructor prototype

在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。

0 个答案:

没有答案