7

Lets say I have

var myObject = {

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

}

I have tried various functions found here and stuff like this.constructor.name but i always get 'Object' as the value returned. Is there any way to get the actual name of the variable in this situation?

edit to explain the why so maybe people will better understand...I want to be able to make a function that is continuously called with setInterval. Something like this:

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
  }
}

This works just fine if i hardcode 'myObject' to this.objectName but I don't want it to be hardcoded. Problem is that I wan't just do setInterval("window[this.objectName]",100) becausethisis not in the right context whensetInterval` is run, and I don't want to have the objectname hardcoded

slinkhi
  • 947
  • 4
  • 16
  • 32

4 Answers4

5

No, you can't do that in JavaScript.

Evan Davis
  • 35,493
  • 6
  • 50
  • 57
3

One way;

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

Not very nice IMO, marginally better if you wrap it in your own namespace.

You could also always

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

In light of your update you don't need to resolve the object at all;

var myObject = {
    'intval' : '',
    'timeout' : 1500,
    'start' : function () {
        var self = this;
        this.intval = window.setInterval(function() {
            self.myFunction()
        }, this.timeout);
    },
    'myFunction' : function() {
        alert(this.intval);
    }
}
Alex K.
  • 171,639
  • 30
  • 264
  • 288
1
for (var name in this.global)
      if (this.global[name] == this) 
        return name 

How to get class object's name as a string in Javascript?

Community
  • 1
  • 1
jbabey
  • 45,965
  • 12
  • 71
  • 94
1

In short, nope.

The way you're creating your objects, myObject is nothing more than a label with a (relatively loose) affiliation with an object literal. In Java or C++ terms, myObject is more like a pointer then a class name. If you want a stronger link between the label myObject and the object it references, you'll need to use a constructor or subclass pattern. See this article on golimojo.com for a pretty solid overview.

Matt McMahon
  • 655
  • 5
  • 5