2014-12-15 3 views
1

Мне нужно получить имена участников (поля и методы) класса или, по крайней мере, имена полей. Например, у меня есть следующий класс:JS - получить имена членов класса

function PersonClass(){ 
    this.name="Jack"; 
    this.surname="SomeOne"; 
} 

У меня есть два решения:

  1. преобразование класс в строку и использовать регулярные выражения
  2. создать метод в классе и с помощью for ... in this получить член. Однако для запуска этого метода мне нужно создать экземпляр класса.

Мне не нравятся их оба. Существуют ли другие решения для получения имен участников?

+0

'console.dir()'? – user2570380

+1

Что вы подразумеваете под «классом»? JavaScript (pre-ES6) не имеет классов. – Pointy

+0

Не могли бы вы объяснить свой первый вариант? Похоже, у вас есть что-то конкретное. Вы говорите о функции конструктора? Вы управляете кодом для «класса»? –

ответ

0

Что вы собираетесь делать с именами участников, как только вы их получите?

Почему вы предполагаете, что сможете каким-то образом получить их, когда их еще нет, до тех пор, пока конструктор не вызовет создание определенного экземпляра?

Почему вы полагаете, что можете написать регулярное выражение настолько умное, чтобы он мог достаточно разбирать JS, чтобы вытащить все свойства (а не «поля»)? Как такое регулярное выражение может идентифицировать свойство, которое динамически и условно добавляется методом прототипа, определенным в другом месте?

Если вы хотите записать такие метаданные, а затем просто сделать это в явном виде, скорее всего, как собственность на конструкторе:

PersonClass.properties = ['name', 'surname']; 

В какой-то далекой версии JS, вы можете быть в состоянии сделать это по аннотациям:

@properties('name', 'surname') 
function PersonClass() { ... 
+0

Спасибо за ваше время. Что мне нужно, я подробно описал здесь http://codereview.stackexchange.com/questions/73697/binding-model-to-view –

+0

У вас перед вами ослепительно большая задача. Что вы надеетесь достичь, что другие аналогичные рамки привязки еще не существуют? Вы понимаете, что все, что вы создадите, мгновенно устареет, когда «Object.observe» или «Proxy» попадают в браузеры? Почему вы беспокоитесь об IE8 в наши дни? Для ваших клиентов, которые настаивают на поддержке IE8, просто продолжайте писать jQuery. –

+0

Вы даже не представляете, как я ненавижу IE8 и многие другие продукты MS. Но вы должны спросить не меня, а Билла Гейтса, почему даже в Win7 это браузер по умолчанию. О других фреймворках - я начал с углового, и я закончил здесь http://stackoverflow.com/questions/27467908/angularjsrequirejs-and-modules, мой вывод плох для большого приложения и, кроме того, его структура не подходит для других наших фреймворков + Я хочу реализовать «компиляцию во время выполнения по запросу - не дожидаться, пока страница не будет полностью загружена». Я посмотрел на позвоночник и ember - их шаблоны не были хороши для меня. –

0

Вы можете сделать это, используя prototype объекта. Например, если это определение класса типа объектов JavaScript:

var MyObject = function() { 

}; 
MyObject.prototype.foo = 3; 
MyObject.prototype.bar = function(){ 
    alert("bar"); 
}; 

Это будет работать (экземпляр не требуется):

for(var x in MyObject.prototype) 
    alert(x); // alerts "foo" and then "bar" 

Точно так же экземпляр, как правило, работают

var o = new MyObject(); 
for(var x in o) 
    alert(x); // also alerts "foo" and then "bar" 
+0

Спасибо за ваше время. Я попробую. –

+0

Нет, это не хорошо. Первый способ отобразит только поля и методы прототипа, но не те, которые вы можете объявить в MyObject. Для второго пути см. 2. –

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