В JavaScript переменные ссылаются на объекты, но сами объекты не названы.Итак, учитывая объект, вы не можете спросить его имя;это не имеет смысла.Когда вы думаете о том, как ссылки передаются в javascript, вы понимаете, насколько проблематичным является то, что вы пытаетесь сделать в общем случае.Например, рассмотрим следующее:
var a = {first_name: "Mark"};
var b = a;
// a and b both point to the same object
Если я спрашиваю имя этого объекта, должно ли оно возвращать 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?
Если имя объекта важно и вы хотите его отобразить, вам следует добавить свойство name к объекту и использовать его вместо этого.