【问题标题】:Object (string or array) NAME. how to get it?对象(字符串或数组)名称。如何得到它?
【发布时间】:2009-12-27 19:47:03
【问题描述】:

我需要一个这样的原型:

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

所以我可以:

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

我应该在警报中有“z”。

我正在使用 Chrome,调用者/被调用者似乎返回为空。

【问题讨论】:

  • 为什么需要这些信息?
  • 你做错了。您分配数组的变量的名称应该是完全不相关的。如果不是,你应该重构你的代码。
  • 多么无用的评论。只是说您没有阅读所有讨论并且您没有理解问题。

标签: javascript arrays prototype object


【解决方案1】:

您可以做的最好的事情是在创建数组时始终明确设置数组的名称:

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

您可以通过一个函数 makeArray 来设置作为参数传递的名称:

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

本质问题是几个变量可以指向同一个数组:

var z = [],
    x = z;

那么名称应该是什么:z 还是 x?

【讨论】:

  • 谢谢,但这改变了问题。我需要我的问题的答案。
  • 你可以问它,并不意味着它是一个明智的问题。
【解决方案2】:

问题是一个变量(如数组)可以有多个名称。例如:

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

数组的名称是什么,a 还是 b?

【讨论】:

    【解决方案3】:

    做不到。无法访问存储对对象的引用的变量的名称。也许您应该解释一下为什么需要这样的行为,以便有人可以建议您解决问题的替代方法。

    【讨论】:

    • 好吧,我想添加一个原型来将字符串或数组(字符串化)保存到 loalStorage。我显然可以制作一个愚蠢的功能,例如: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"
    【解决方案4】:

    这样做的唯一方法是暴力检查全局对象的所有属性(假设变量是全局的),直到找到 === 数组的属性。当然,它可以被多个变量引用,因此您必须选择您获得的名称之一。此实现获取第一个变量来引用数组,并将在浏览器和 Web 工作线程中工作:

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

    当然,我完全不推荐这个。不要这样做。

    【讨论】:

      【解决方案5】:

      进一步测试 object.getName().. 我发现了这个“问题”:

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

      发生这种情况是因为它们具有相同的内容,并且 getName 会检查内容。 在这种情况下,一个解决方案可能是返回一个数组。

      但我仍在为这个脑力激荡的问题寻找一个明确的解决方案。

      【讨论】:

        【解决方案6】:

        所以目前最好的答案是以利亚的

        更一般地说:

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

        不知道有没有更好的解决方案。

        【讨论】:

          猜你喜欢
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 2022-12-02
          • 1970-01-01
          • 1970-01-01
          • 2012-07-03
          • 2017-09-08
          • 1970-01-01
          相关资源
          最近更新 更多