2016-03-15 4 views
0

Идея состоит в том, чтобы получить список методов/свойств класса. Например, у меня есть этот класс:Javascript ES6 возвращает членов класса

// foo.js 
class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    //, 
    meh() { 
     return 'bar'; 
    } 
} 
module.exports = FooController; 

Теперь я хочу, чтобы получить член FooController. Это должно быть сделано легко для яваскрипта простого объекта, но не с классом:

// index.js 
var Foo = require('foo'); 
var foo = new Foo(); 

// inspect 
console.log(foo); // expected: { bar, meh }, but got {} 

// struggle with lodash 
var _ = require('lodash');  
console.log(_.keys(foo)); // expected ['bar', 'meh'], but got [] 

Любой идеей? Заранее благодарим за любую помощь или предложения.

+0

Является ли это запятой позади * бар предназначенный? Я получаю там синтаксическую ошибку. – Randy

+0

Извините, это была опечатка - позвольте мне отредактировать ее и спасибо за исправление! – Adiono

ответ

1

Вы должны запросить prototype Объект категории Foo():

// index.js 
var Foo = require('foo'); 
var foo = new Foo(); 

var _ = require('lodash');  
console.log(Object.getOwnPropertyNames((Object.getPrototypeOf(foo)))); // shows ['bar', 'meh', 'constructor'] 
// or 
console.log(Object.getOwnPropertyNames(foo.__proto__)); // shows ['bar', 'meh', 'constructor'] 

Предлагаемый _.keys(foo) возвращает только принадлежащие ему свойства объекта (bar() и meh() наследуется), который фактически пуст [].

Чтобы получить методы, нужно:

  • Чтобы получить доступ к prototype объекту экземпляра
  • Перечислит свойство prototype. Поскольку необходимые свойства не перечислены (Object.keys() или _.keys() не будет работать), необходимо использовать Object.getOwnPropertyNames().

Подробнее о Object.getPrototypeOf() и Object.getOwnPropertyNames().
См. this fiddle для получения полного примера.

+0

на моем конце, он показывает '[]' вместо '['bar', 'meh']' – Adiono

+0

@Adiono Упс. Ответ обновлен. –

+0

Прохладный! теперь он работает, спасибо Дмитрию! – Adiono

0

Вариант 1: Вы можете напечатать class constructor, которым дает желаемый результат:

class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    meh() { 
     return 'bar'; 
    } 
} 


var foo = new FooController(); 

console.log(foo.constructor); 

function class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    meh() { 
     return 'bar'; 
    } 
} 

Вариант 2: вы можете просто напечатать class object без привязки его:

class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    meh() { 
     return 'bar'; 
    } 
} 

console.log(FooController); 

function class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    meh() { 
     return 'bar'; 
    } 
} 
+1

Вопрос заключается в том, как извлечь членов, а не как распечатать чертеж. – zeroflagL

+0

Да, @zeroflagL прав! Я хочу, чтобы члены не были планом. – Adiono

2

class es в ES6 всего лишь кодирование сахара над методами определения функции prototype в ES5.Так для примера:

class FooController { 
    constructor() { 
    } 
    *bar(next) { 
     yield next; 
     return 'meh'; 
    } 
    //, 
    meh() { 
     return 'bar'; 
    } 
} 
module.exports = FooController; 

эквивалент ES5 является:

var FooController = (function() { 
    function FooController() { } // This method will act as our constructor 

    // All methods defined on the prototype are equivalent with the 
    // so called class methods in ES6 
    FooController.prototype.bar = *function(next) { yield next; return 'meh'; }; 

    FooController.prototype.meh = function() { return 'bar'; }; 

    return FooController; 
})(); 

доступ к "общественной" методы от FooController вы можете:

  1. Access прототип явно как так: FooController.prototype

    console.log(FooController.prototype.meh()) // => 'bar'

  2. Доступ прототипом построенного объекта любит так:

    var foo = new FooController(); var proto = foo.__proto__; console.log(proto.meh()) // => 'bar'

Когда вы строите foo вызова new ключевое слово, amoung другой, эти несколько шагов будут происходить подавление:

  1. Новый объект будет создан
  2. Прототип этого объекта w плохо указать прототип FooController;

До тех пор, как вы думаете о class methods как сахар кодирования над prototype методами становится намного проще, чтобы получить власть над ситуацией.

Надеюсь, это поможет.

+0

Он не работает, он показывает '[]' в обоих направлениях (см. Https://jsfiddle.net/budiadiono/r2wdgkmk/1/). Думаю, я собираюсь использовать ответ @Dmitri Pavlutin. – Adiono

+0

'meh' и' bar' не являются перечисляемыми свойствами. Вот почему 'Object.keys()' не работает. –

+0

Да, Димитрий прав. Я отредактирую свой ответ. Вы можете получить доступ к методам непосредственно из прототипа, вы не можете их перечислить с помощью метода 'keys()'. –

Смежные вопросы