Как получить имя объекта класса в виде строки в Javascript?

foo.reverse() фактически меняет элементы в контейнере. reversed() фактически ничего не отменяет, он просто возвращает объект, который можно использовать для итерации по элементам контейнера в обратном порядке. Если это то, что вам нужно, оно часто быстрее, чем наоборот.

39
задан Bill the Lizard 29 September 2011 в 14:03
поделиться

4 ответа

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

function myClass() { 
  this.myName = function () { 
    // search through the global object for a name that resolves to this object
    for (var name in this.global) 
      if (this.global[name] == this) 
        return name 
  } 
}
// store the global object, which can be referred to as this at the top level, in a
// property on our prototype, so we can refer to it in our object's methods
myClass.prototype.global = this
// create a global variable referring to an object
var myVar = new myClass()
myVar.myName() // returns "myVar"

Обратите внимание, что это уродливый хак, и не должен использоваться в производственном коде. Если существует более одной переменной, ссылающейся на объект, вы не можете сказать, какую из них вы получите. Он будет искать только глобальные переменные, поэтому он не будет работать, если переменная является локальной для функции. В общем, если вам нужно что-то назвать, вы должны передать имя конструктору при его создании.

edit : Чтобы ответить на ваше разъяснение, если вам нужно иметь возможность ссылаться на что-то из обработчик события, Вы не должны ссылаться на него по имени, но вместо этого добавьте функцию, которая ссылается на объект напрямую. Вот быстрый пример, который я привел, который показывает нечто похожее на то, что вы пытаетесь сделать:

function myConstructor () {
  this.count = 0
  this.clickme = function () {
    this.count += 1
    alert(this.count)
  }

  var newDiv = document.createElement("div")
  var contents = document.createTextNode("Click me!")

  // This is the crucial part. We don't construct an onclick handler by creating a
  // string, but instead we pass in a function that does what we want. In order to
  // refer to the object, we can't use this directly (since that will refer to the 
  // div when running event handler), but we create an anonymous function with an 
  // argument and pass this in as that argument.
  newDiv.onclick = (function (obj) { 
    return function () {
      obj.clickme()
    }
  })(this)

  newDiv.appendChild(contents)
  document.getElementById("frobnozzle").appendChild(newDiv)

}
window.onload = function () {
  var myVar = new myConstructor()
}
43
ответ дан 27 November 2019 в 02:25
поделиться

Краткий ответ: Нет. MyObj - это не имя объекта, это имя переменной, содержащей ссылку на объект - вы можете иметь любое количество других переменных, содержащих ссылка на тот же объект.

Теперь, если это ваша программа, тогда вы устанавливаете правила: если вы хотите сказать, что на любой данный объект будет ссылаться только одна переменная, и старательно применять это в своем коде, затем просто установите свойство для объекта с именем переменной.

Тем не менее, я сомневаюсь, что то, что вы просите, на самом деле то, что вы действительно хотите. Может быть, опишите вашу проблему более подробно ...?


Pedantry: JavaScript не имеет классов. someObject является функцией конструктора. Учитывая ссылку на объект, вы можете получить ссылку на функцию, которая ее создала, используя свойство конструктора .


В ответ на предоставленные вами дополнительные сведения:

Ответ, который вы ищете, можно найти здесь : JavaScript Callback Scope (и в ответ на многочисленные другие вопросы по SO - это обычная путаница для новичков в JS). Вам просто нужно обернуть вызов к члену объекта в замыкание, которое сохраняет доступ к объекту контекста.

20
ответ дан 27 November 2019 в 02:25
поделиться

Вы можете сделать это, преобразовав конструктор в строку, используя .toString () :

function getObjectClass(obj){
   if (typeof obj != "object" || obj === null) return false;
   else return /(\w+)\(/.exec(obj.constructor.toString())[1];}
11
ответ дан 27 November 2019 в 02:25
поделиться

Вы можете добиться своей цели, используя его в функции, а затем изучить источник функции с TOSTRING () :

var whatsMyName;

  // Just do something with the whatsMyName variable, no matter what
function func() {var v = whatsMyName;}

// Now that we're using whatsMyName in a function, we could get the source code of the function as a string:
var source = func.toString();

// Then extract the variable name from the function source:
var result = /var v = (.[^;]*)/.exec(source);

alert(result[1]); // Should alert 'whatsMyName';
4
ответ дан 27 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: