Есть ли способ определить, является ли аргумент методом в JavaScript? - PullRequest
0 голосов
/ 23 февраля 2020

Есть ли способ проверить, является ли аргумент, переданный в функцию, методом ?

Например, я хочу определить внутри функции, является ли один из входных данных методом или автономная функция:

function isMethod(collection, fct) {
  var isFct = (typeof fct === 'function');
  var isProperty = (collection.hasOwnProperty(fct)); // doesn't work b/c fct = object1.methodFct, not methodFct
  return `${isFct}, ${isProperty}`;
}

function nonMethodFct(a, b) {
  return a + b;
}

var object1 = {
  methodFct(a, b) { 
    return a + b;
  }
};

console.log(typeof object1.methodFct === 'function' && object1.hasOwnProperty('methodFct')); // returns true

var expectTrueFalse = isMethod(object1, nonMethodFct); // returns true, false
console.log(expectTrueFalse);
var expectTrueTrue = isMethod(object1, object1.methodFct); // returns true, (false)
console.log(expectTrueTrue);

Поскольку ввод 'methodFct' возвращает ошибку для неопределенного (потому что methodFct скрыт внутри лексической области object1), я должен ввести ее в нотации доступа к свойству (object1.methodFct), которая нарушает проверку isProperty внутри функции.

Другими словами, я хочу сделать то, что делает независимый console.log(), но я не знаю, как сделать это с аргументом вместо жестко заданной строки.

I поиграл с JSON.stringify и .toString(), но они, казалось, только строчили все содержимое collection и fct, а не их имена.

1 Ответ

0 голосов
/ 23 февраля 2020

Использование fct.name

function isMethod(collection, fct) {
    console.log(`fct.name = '${fct.name}'`);
    return (typeof collection[fct.name] === 'function');
}

function nonMethodFct(a, b) {
    return a + b;
}

var object1 = {
    methodFct(a, b) { 
        return a + b;
    }
};


var expectFalse = isMethod(object1, nonMethodFct); // false
console.log(expectFalse);
var expectTrue = isMethod(object1, object1.methodFct); // true
console.log(expectTrue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...