Также кажется, что, по крайней мере, в Visual Studio 2015, TypeScript 1.5, «var» допускает несколько объявлений с одним и тем же именем переменной в блоке, а «let» - нет.
Это выиграло 'генерирует ошибку компиляции:
var x = 1;
var x = 2;
Это будет:
let x = 1;
let x = 2;
На прототипе вы можете использовать Object.getOwnPropertyNames :
Object.getOwnPropertyNames( Animal.prototype )
// [ 'constructor', 'getAnimalType' ]
Я знаю, знаю, но эй ...
const deepProps = x => x && x !== Object.prototype && Object.getOwnPropertyNames( x ).concat( deepProps( Object.getPrototypeOf( x ) ) || [] );
const deepFunctions = x => deepProps( x ).filter( name => typeof x[ name ] === "function" );
const userFunctions = x => new Set( deepFunctions( x ).filter( name => name !== "constructor" && !~name.indexOf( "__" ) ) );
использование:
class YourObject {
hello() { return "uk"; }
goodbye() { return "eu"; }
}
class MyObject extends YourObject {
hello() { return "ie"; }
}
const x = new MyObject();
userFunctions( x ); // [ "hello", "goodbye" ]
Если вам нужно также получить методы суперкласса, вы можете называть Object.getPrototypeOf()
несколько раз, пока не найдете их все. Вероятно, вам захочется остановиться, когда вы дойдете до Object.prototype
, потому что методы там фундаментальны, и вы обычно не хотите трогать их каким-либо кодом, использующим отражение.
Вопрос Получить функции (методы) класса есть ответ, который включает в себя функцию для этого, но он имел несколько недостатков (в том числе использование условия цикла, которое имело побочный эффект изменения аргумента функции, который я фигурирую делает два сомнительных стиля кода в одной строке кода ...), поэтому я переписал его здесь:
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, чтобы сделать код более компактным.
проверьте этот скрипт
https://jsfiddle.net/ponmudi/tqmya6ok/1/
class Animal {
constructor(type){
this.animalType = type;
}
getAnimalType(){
console.log('this.animalType: ', this.animalType );
}
}
let cat = new Animal('cat');
//by instance
document.getElementById('1').innerHTML = Object.getOwnPropertyNames(cat);
//by getting prototype from instance
document.getElementById('2').innerHTML = Object.getOwnPropertyNames(Object.getPrototypeOf(cat));
//by prototype
document.getElementById('3').innerHTML = Object.getOwnPropertyNames(Animal.prototype);
Поскольку методы класса ES6 не перечислимы, у вас нет другого варианта, кроме как использовать Object.getOwnPropertyNames () , чтобы получить массив всех его свойств.
После для этого существует несколько способов использования методов извлечения, наиболее простым из которых может быть использование Array.prototype.forEach () .
Проверьте следующий фрагмент:
Object.getOwnPropertyNames(Animal.prototype).forEach((value) => {
console.log(value);
})
Для тех, кто использует машинописный текст, интересующийся такими вопросами, вы можете сделать много вещей простым способом, используя метаданные-отражение api. Например, вы можете добавлять метаданные к своим классам с помощью декораторов и получать информацию о методах классов, их свойствах и их типах. Typcript и его типы позволяют делать подобные вещи на скомпилированные языки, такие как java, c # и их apros-introspection.
Взгляните на эти ссылки для получения дополнительной информации:
https: //www.typescriptlang.org/docs/handbook/decorators.html