Если вам нужно получить методы суперкласса, вы можете позвонить по телефону Object.getPrototypeOf()
, пока не найдете их все. Вероятно, вам захочется остановиться, когда вы доберетесь до Object.prototype
, потому что методы там фундаментальны, и вы обычно не хотите трогать их каким-либо кодом, использующим отражение.
Вопрос Get functions (methods) of a class имеет ответ, который включает в себя функцию для этого, но у него было несколько недостатков (в том числе использование условия цикла, которое имело побочный эффект изменения аргумента функции, который, как я полагаю, вызывает два сомнительных стиля кода в одной строке кода ...), поэтому я переписать его здесь:
export function listMethodNames (object, downToClass = Object)
{
// based on code by Muhammad Umer, https://stackoverflow.com/a/31055217/441899
let props = [];
for (let obj = object; obj !== null && obj !== downToClass.prototype; obj = Object.getPrototypeOf(obj))
{
props = props.concat(Object.getOwnPropertyNames(obj));
}
return props.sort().filter((e, i, arr) => e != arr[i+1] && typeof object[e] == 'function');
}
Как и исправления ошибки в исходном коде (который не копировать объект в другую переменную для цикла , поэтому к моменту, когда он был использован для фильтрации в обратной линии, он больше недействителен), это дает необязательный аргумент, чтобы остановить итерацию в настраиваемом классе. Он по умолчанию будет Object
(поэтому методы Object
исключены, и если вы хотите включить их, вы можете использовать класс, который не отображается в цепочке наследования ... возможно, создание класса маркера, например class IncludeObjectMethods{}
, может иметь смысл). Я также изменил цикл do
на более чистый цикл for
и переписал функцию фильтра function ...
старого стиля в функцию со стрелкой ES6, чтобы сделать код более компактным.
Если не итерация 'животных .prototype' работа? Из того, что я понимаю, базовая архитектура объекта по-прежнему совпадает с «старым» способом. – slebetman
Animal.prototype раскрывает методы. Я думаю, что проблема заключается в том, чтобы перебирать их. для .. in, похоже, не работает. – seasick