ES6 - циклические статические методы класса [duplicate]

Также кажется, что, по крайней мере, в Visual Studio 2015, TypeScript 1.5, «var» допускает несколько объявлений с одним и тем же именем переменной в блоке, а «let» - нет.

Это выиграло 'генерирует ошибку компиляции:

var x = 1;
var x = 2;

Это будет:

let x = 1;
let x = 2;
26
задан seasick 17 June 2015 в 03:05
поделиться

6 ответов

На прототипе вы можете использовать Object.getOwnPropertyNames :

Object.getOwnPropertyNames( Animal.prototype )
// [ 'constructor', 'getAnimalType' ]
43
ответ дан Paulpro 27 August 2018 в 15:36
поделиться

Я знаю, знаю, но эй ...

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" ]
6
ответ дан goofballLogic 27 August 2018 в 15:36
поделиться

Если вам нужно также получить методы суперкласса, вы можете называть 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, чтобы сделать код более компактным.

0
ответ дан Jules 27 August 2018 в 15:36
поделиться

проверьте этот скрипт

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);
0
ответ дан Ponmudi VN 27 August 2018 в 15:36
поделиться

Поскольку методы класса ES6 не перечислимы, у вас нет другого варианта, кроме как использовать Object.getOwnPropertyNames () , чтобы получить массив всех его свойств.

После для этого существует несколько способов использования методов извлечения, наиболее простым из которых может быть использование Array.prototype.forEach () .

Проверьте следующий фрагмент:

Object.getOwnPropertyNames(Animal.prototype).forEach((value) => {
    console.log(value);
})
2
ответ дан Powell_v2 27 August 2018 в 15:36
поделиться

Для тех, кто использует машинописный текст, интересующийся такими вопросами, вы можете сделать много вещей простым способом, используя метаданные-отражение api. Например, вы можете добавлять метаданные к своим классам с помощью декораторов и получать информацию о методах классов, их свойствах и их типах. Typcript и его типы позволяют делать подобные вещи на скомпилированные языки, такие как java, c # и их apros-introspection.

Взгляните на эти ссылки для получения дополнительной информации:

https: //www.typescriptlang.org/docs/handbook/decorators.html

https://www.npmjs.com/search?q=reflect-metadata

0
ответ дан Yago Lopez 27 August 2018 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: