Промежуточное значение в новом созданном прототипе - PullRequest
1 голос
/ 31 января 2020

Я столкнулся с проблемой, которую не могу понять. Поэтому я создал новую функцию, которая содержит несколько функций. Это мой код:

(() => {
    function BetterArray(array) {
        this.array = array;
    }

    BetterArray.prototype.map = function (fn) {
        return Array.prototype.map.call(this.array, fn);
    };

    BetterArray.prototype.collect = function (fn) {
        return Array.prototype.map.call(this.array, fn);
    };

    const a = new BetterArray([1])
        .map((item) => item * 2)
        .collect((item) => item * 2);

    console.log(a);
})();

В строке "collect" я получил ошибку Uncaught TypeError: (промежуточное значение) .map (...). Collect не является функцией . Мне просто любопытно, почему появляется эта ошибка и как я могу правильно написать этот код, чтобы избежать этого. Кроме того, когда я меняю map на collect - я не получаю эту ошибку.

Я знаю, что обе функции одинаковы, но я хочу быть уверен, что они не основаны на теле функции.

Спасибо за ваше время!

1 Ответ

3 голосов
/ 31 января 2020

Прямо сейчас методы .map и .collect возвращают простые массивы , а у простых массивов нет метода .collect.

Когда вы вызываете .map на BetterArray, вы должны создать и вернуть новый экземпляр BetterArray, если хотите иметь возможность впоследствии вызывать BetterArray методы, такие как .collect:

(() => {
    function BetterArray(array) {
        this.array = array;
    }

    BetterArray.prototype.map = function (fn) {
        const arr = Array.prototype.map.call(this.array, fn);
        const newBetterArr = new BetterArray(arr);
        return newBetterArr;
    };

    BetterArray.prototype.collect = function (fn) {
        return Array.prototype.map.call(this.array, fn);
    };

    const a = new BetterArray([1])
        .map((item) => item * 2)
        .collect((item) => item * 2);

    console.log(a);
})();

(если вы хотите, чтобы .collect также приводил к экземпляру BetterArray, примените те же логики c для метода .collect)

...