2012-05-31 5 views
4

Допустим, у меня естьJavascript получить имя родительского объекта/переменной

var myObject = { 

    'myFunction' : function() { 
    // something here that lets me get 'myObject' 
    } 

} 

Я пробовал различные функции, найденные здесь и такие вещи, как this.constructor.name, но я всегда получаю «объект», как возвращается значение. Есть ли способ получить фактическое имя переменной в этой ситуации?

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

var myObject = { 
    'intval' : '', 
    'timeout' : 500, 

    'start' : function() { 
    this.objectName = 'myObject'; // <--I want this to be dynamically popped 
    this.intval=window.setInterval("window['"+this.objectName+"'].myFunction()",this.timeout); 
    }, 

    'stop' : function() { 
    window.clearInterval(this.intval); 
    this.intval=''; 
    }, 

    'myFunction' : function() { 
    // do something 
    } 
} 

Это прекрасно работает, если я жёстко «MyObject» в this.objectName, но я не хочу, чтобы это было жёстко. Проблема в том, что я просто не делаю setInterval("window[this.objectName]",100) becauseis not in the right context when setInterval`, и я не хочу иметь имя объекта hardcoded

+0

Вы ищете что-то вроде 'this', это способ ссылки на объект? – helpermethod

+0

нет, я не ищу ссылку на объект, я ищу фактическое имя объекта – slinkhi

+0

Для отредактированного вопроса: start: function() { var that = this; это.intval = setInterval (функция() { that.myFunction(); }, this.timeout); }, – jasssonpet

ответ

3

Один из способов;

var myObject = { 
    'myFunction' : function() { 
     for (var name in window) { 
      if (window[name] === this) { 
       alert(name); 
       break; 
      } 
     } 
    } 
} 

Не очень красиво ИМО, немного лучше, если вы оберните его в свое собственное пространство имен.

Вы могли бы также всегда

var myObject = { 
    moniker: "myObject", 
    ... 

В свете вашего обновления, вам не нужно разрешить объект на всех;

var myObject = { 
    'intval' : '', 
    'timeout' : 1500, 
    'start' : function() { 
     var self = this; 
     this.intval = window.setInterval(function() { 
      self.myFunction() 
     }, this.timeout); 
    }, 
    'myFunction' : function() { 
     alert(this.intval); 
    } 
} 
+0

Да, я раньше просто устанавливал свойство, подобное вашему 2-му примеру – slinkhi

+0

Обновлено выше, если ваша проблема была обязательной для 'this', вам не нужно разрешать имя –

+0

aha! ваш первый пример работал отлично, но последнее ваше редактирование ТОЧНО, что я искал, спасибо! – slinkhi

1

Короче говоря, нет.

То, как вы создаете свои объекты, myObject - не более чем метка с относительно свободной связью с объектным литералом. В терминах Java или C++ myObject больше похож на указатель, а затем на имя класса. Если вам нужна более прочная связь между меткой myObject и объектом, с которым он ссылается, вам понадобится шаблон конструктора или подкласса. См. this article на golimojo.com для довольно солидного обзора.

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