2015-11-27 4 views
1

создать класс под названием Foo:Javascript: как получить имя экземпляра?

foo = function() 
{ 
... 
} 

Затем я создаю объект под названием груши из класса Foo:

pear = new foo(); 

Затем я поставил объект грушевого в массиве:

array_obj = [pear]; 

Итак, когда я разбираю массив_obj с помощью цикла «for», я хочу получить имя экземпляра, то есть строку «груша»:

for(var i = 0; i < array_obj.length; i++) 
{ 
    console.log(array_obj[i].name); 
} 

Но это не сработает, потому что array_obj[i].name не возвращает имя «груша».

У вас есть идея? Спасибо вам заранее, сердечно.

+2

просто вы не можешь – Hacketo

+1

Рассмотрите следующий действительный код JS на минуту: 'груша = яблоко = новый Foo() ' – robertklep

+1

Вы можете ввести в заблуждение это для функции [' function.name'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/name), которая является новой функциональностью ES6. – Andy

ответ

4

Изменение функции:

foo = function(name) 
{ 
    this.name = name; 
} 

И ваш вызов:

var pear = new foo("pear"); 
+1

Я бы избавился от 'var pear' (или изменил имя, по крайней мере) - он объединяет имя переменной с свойством' .name' объекта. – Alnitak

+1

ОК, все говорят, что я не могу этого сделать. Поэтому я должен использовать решение Пауло. Всем спасибо. – totoaussi

3

Вы не можете это сделать. 1 - он не работает, а 2 - это «нарушение уровня» для объекта, который знает что-либо об именах переменных, которые ссылаются на него.

Кроме того, имена переменных являются удобством для программиста. Они могут меняться с помощью выбора программиста или даже автоматически меняться такими вещами, как министры или обфускаторы.

Если имя действительно имеет значение, оно либо должно стать свойством самого объекта (передано в конструкторе, в ответ на ответ Пауло), либо вам нужно сохранить «хэш» (иначе называемую «карта»), который карты «человек машиночитаемых имен» к отдельным объектам:

var map_obj = { pear: new foo() }; 

Вы можете перебрать ключи от этой карты (Object.keys(map_obj)), чтобы найти каждый объект по имени. Однако в этом случае каждое имя должно быть уникальным - карта не может содержать дубликаты ключей.

2

Вы не можете, потому что

array_obj[i].name == pear.name == (new foo()).name 

И это зависит от того, что вы вернетесь из foo() функции. Я подозреваю, что он будет возвращать undefined, потому что вы не определить такое свойство в foo()

Вы можете использовать @Paulo Раствор

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