views:

66

answers:

6

I need a prototype done in this way:

Array.prototype.getname=function(){ [...]return arrayname; }

So I can:

z=new Array;
alert(z.name);

and I should have "z" in the alert.

I'm working on Chrome and caller/callee seem to return empty.

+1  A: 

Can't be done. There is no way to access the name of the variable which is storing a reference to the object. Perhaps you should explain why you need behavior like this, so someone can suggest you an alternative way to approach the problem.

Jani Hartikainen
Well I wanted to add a prototype to save a String or an Array(stringified) to loalStorage. I can obviously make a stupid function for example: `function save(s,name) { localStorage[name]=s; } (for a string) but it would be nicer to do: var mystring="this is a lame string"; mystring.save(); and so have localStorage.mystring=="this is a lame string"`
Zibri
+2  A: 

The best you can do is to always explicitly set the array's name when you create it:

var z = [];
z.name = 'z';

You could do this by having a function makeArray that sets the name passed as an argument:

function makeArray(name) {
    var arr = [];
    arr.name = name;
    return arr;
}

The essential problem is that the several variables can point to the same array:

var z = [],
    x = z;

Then what should the name be: z or x?

Rich
Thanks but this changes the question.I need an answer to *my* question.
Zibri
Just because you can ask it, doesn't mean it's a sensible question to ask.
August Lilleaas
+1  A: 

The problem is that a variable (like an array) can have several names. For example:

var a = new Array();
var b = a;
a[0] = "hello";
alert(b[0]);//"hello"

What is the name of the array, a or b?

Marius
+1  A: 

The only way to do this would be to brute-force check all properties of the global object (assuming the variable is global) until you find a property that === the array. Of course, it could be referenced by multiple variables so you would have to pick one of the names you get. This implementation gets the first variable to reference the array and will work in browsers and web worker threads:

Array.prototype.getName = function () {
  var prop;
  for (prop in self) {
    if (Object.prototype.hasOwnProperty.call(self, prop) && self[prop] === this) {
      return prop;
    }
  }
  return ""; // no name found
};

Of course, I don't recommend this at all. Do not do this.

Eli Grey
A: 

So For now the best answer is Elijah's

More generally:

Object.prototype.getName = function () { 
  var prop; 
  for (prop in self) {
     if (Object.prototype.hasOwnProperty.call(self, prop) && self[prop] === this && self[prop].constructor == this.constructor) { 
       return prop; 
     } 
  } 
  return ""; // no name found 
};

I wonder if there are better solutions.

Zibri
A: 

Further testing the object.getName().. i found this 'problem':

test1='test'
test
test2='test'
test
test1.getName()
test1
test2.getName()
test1

this happens because they have the same content and getName checks for content. a solution could be to return an Array in that case.

But I'm still searching for a definitive solution to this brainteasing problem.

Zibri