Подтвердить что ты не робот

Метод вызова объектов в массиве с использованием map()

Я пытаюсь вычислить код с одним слоем, используя map.

Вот простая настройка.

function Cat(name) {
    this.name = name;
    // FYI: using __proto__ is discouraged. thanks @KarelG
    this.__proto__.mew = function () {
        console.log(this.name + " mews");
    };
}

var cats = [
    new Cat('MB'),
    new Cat('503')
];

Затем я могу использовать map() для вызова метода mew у кошек.

cats.map(function (cat) {
    cat.mew();
});
// MB mews
// 503 mews

call() на прототипе также работает.

cats.map(function (cat) {
    Cat.prototype.mew.call(cat);
});
// MB mews
// 503 mews

И вот мой последний однострочный, но он испускает ошибку, и я не мог понять, почему:

cats.map(Cat.prototype.mew.call);

// Uncaught TypeError: undefined is not a function
// at Array.map (<anonymous>)

Проверка typeof Cat.prototype.mew.call говорит, что это function и map() должен быть функцией.

Может ли кто-нибудь объяснить, почему это не работает? Что я пропустил и где исправить?

4b9b3361

Ответ 1

Может ли кто-нибудь объяснить, почему это не работает? Что я пропустил и где правильно?

В сообщении об ошибке указано

VM1100: 15 Uncaught TypeError: undefined не является функцией

Это означает, что он хочет вызвать метод mew в контексте undefined.

Вам нужно связать контекст как

cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );

Demo

function Cat(name) {
    this.name = name;
    this.__proto__.mew = function () {
        console.log(this.name + " mews");
    };
}

var cats = [
    new Cat('MB'),
    new Cat('503')
];
cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );