В javascript переменные ссылаются на объекты, но сами объекты не называются. Поэтому, учитывая объект, вы не можете просто спросить его о его имени; это не имеет смысла. Когда вы думаете о том, как ссылки передаются в javascript, вы понимаете, насколько проблематично то, что вы пытаетесь, в общем случае. Например, рассмотрим следующее:
b
Если я прошу от имени этого объекта, если он вернется a
, b
или оба? Что теперь:
var a = {first_name: "Mark"};
var b = a;
a = undefined;
Это еще более сложно, если учесть, что один и тот же объект может ссылаться на имена в разных областях и модулях. Например:
var a = {first_name: "Mark"};
function test(obj) {
var t = obj;
getNames(obj) // <-- what should that return? a? obj? t? all of them?
}
Дайте конкретный объем, вы можете перебирать имена и находить те, которые равны вашему объекту, но это будет хрупким и, вероятно, неэффективным .
var a = {first_name: "Mark"}
var b = a
var c = {foo: "bar"}
function getNames(obj, scope) {
for (name in scope){
try {
if (scope[name] === obj) console.log(name)
} catch(e){continue} // avoid localStorage security error
}
}
getNames(b, this) // should log 'a' and 'b' because both are in global scope
Но опять-таки приведенный выше код не дает вам имени объекта, он просто смотрит на каждое имя в конкретном объекте (в данном случае на глобальном объекте) и видит, какие из свойств объекта указывают на данный объект.
Конечно, не все объекты, которые в сфере охвата, даже имеют имена. Например::
let arr = [{foo: "bar"}, {foo: "baz"}]
getNames(arr[0]) // <-- what should that return?
Если имя объекта важно и вы хотите его отобразить, вы должны добавить свойство имени к объекту и использовать его вместо этого.