如何获取声明新对象的变量的名称

时间:2015-06-21 00:09:56

标签: javascript object

在JavaScript中,如何获取声明新对象的变量的名称。

  function asdf () {
       this.dosomething = functon () {
          var a = 1;
       };
  }

  var qwer = new asdf();

在asdf()的范围内,我希望能够找到创建该对象实例的变量名。

1 个答案:

答案 0 :(得分:1)

你做不到。实际上,变量根本不会创建对象。变量只包含对象的引用,但可能有多个这样的引用。

此外,应该没有必要。在asdf中,您可以使用this关键字来引用实例本身,该实例与qwer引用的实例相同。

如果你需要asdf中方法中的实例,你可以创建一个对象的局部变量,如下所示:

 function asdf () {
   var memyself = this; // Store reference to `this`
   this.dosomething = functon () {
      var a = 1;
      // Use stored reference, because `this` will refer to `dosomething` here.
      mymyself.dosomethingelse();
   };

   this.dosomethingelse = functon () {
      alert('hello');
   };
 }

 var qwer = new asdf();

另一个例子,让对象将自身绑定到元素的事件。我故意将名称放在HTML中,但您甚至可以从一组名称中生成所有HTML。开始的HTML应该只包含一个元素,在其中或之后添加每个名称的div。

您的对象可能是负责div生命周期的对象。如果您创建一个名称作为参数的对象,它可以创建一个div,添加文本,附加事件处理程序,甚至删除div。下面的代码段不是那么高级,它只是找到元素并将其中一个方法附加到该元素的click事件。

function asdf(element) {
  // If element is a string, use it as id to fetch an actual element. 
  // (Some error checking required in prodction code).
  if (typeof element === "string") {
    element = document.getElementById(element);
  }
  // Store references to myself and my element.
  var me = this;
  me.element = element; // 'this' could be used instead of 'me'.
  
  // Declare method
  this.doSomething = function() {
    alert(me.element.innerText); // Here, 'me' is required.
  }
  
  // Bind method to click event. 'this' could be used instead of 'me'.
  me.element.addEventListener('click', this.doSomething);
}

// Create three object for the three elements.

// You may store the object in a variable
a = new asdf('john');
// But you don't even need to. The object can just exist without external 
// reference (well, apart from the element which still uses its event handler).
new asdf('jane');
new asdf('nick');
Click a name to alert it.
<div class="button" id="john">John Doe</div>
<div class="button" id="jane">Jane Da</div>
<div class="button" id="nick">Nick Name</div>

我希望这是你要解决的问题,这解决了它。如果您仍然需要访问quer,那么您可能正在实施一个糟糕的设计。如果您指定更多详细信息,我(或其他人)可能会为您找到更好的解决方案。