Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取类对象';在Javascript中,名称是字符串吗?_Javascript_Class - Fatal编程技术网

如何获取类对象';在Javascript中,名称是字符串吗?

如何获取类对象';在Javascript中,名称是字符串吗?,javascript,class,Javascript,Class,假设我用Javascript实例化了一个对象,如下所示: var myObj = new someObject(); 现在,是否可以从一个类方法中获取var对象的名称,即string'myObj' 其他详细信息(已编辑): 我想要获取保存对象引用的变量名称的原因是,我的新myObj将在页面上创建一个新的可单击的DIV,需要调用函数myObj.someFunction()。在插入新的DIV时,我需要知道保存对象引用的变量的名称。有没有更好的方法 你说得对,很抱歉把术语弄错了 我之所以想要获取

假设我用Javascript实例化了一个对象,如下所示:

var myObj = new someObject();
现在,是否可以从一个类方法中获取var对象的名称,即string
'myObj'


其他详细信息(已编辑): 我想要获取保存对象引用的变量名称的原因是,我的新
myObj
将在页面上创建一个新的可单击的
DIV
,需要调用函数
myObj.someFunction()
。在插入新的
DIV
时,我需要知道保存对象引用的变量的名称。有没有更好的方法


你说得对,很抱歉把术语弄错了


我之所以想要获取保存对象引用的变量的名称,是因为我的新myObj将在页面上创建一个新的可单击DIV,该DIV需要调用函数myObj.someFunction()。当我插入新的DIV时,我需要知道保存对象引用的变量的名称。有没有更好的方法呢?

简短的回答:没有。myObj不是对象的名称,它是包含对对象引用的变量的名称-可以有任意数量的其他变量包含对同一对象的引用

现在,如果是你的程序,那么你就制定规则:如果你想说任何给定的对象只会被一个变量引用,并且在你的代码中强制执行,那么就在对象上设置一个带有变量名称的属性

也就是说,我怀疑你所要求的是你真正想要的。也许可以更详细地描述一下你的问题


迂腐:JavaScript没有类
someObject
是一个构造函数。给定对对象的引用,可以获得对使用创建该对象的函数的引用


针对您提供的其他详细信息:
你要寻找的答案可以在这里找到:(在回答许多其他问题时,这是JS新手常见的困惑点)。您只需要将对对象成员的调用封装在一个闭包中,以保留对上下文对象的访问。

Shog9是正确的,这没有什么意义,因为一个对象可以由多个变量引用。如果您并不真正关心这一点,您只想找到引用该对象的一个全局变量的名称,您可以执行以下操作:

function myClass() { 
  this.myName = function () { 
    // search through the global object for a name that resolves to this object
    for (var name in this.global) 
      if (this.global[name] == this) 
        return name 
  } 
}
// store the global object, which can be referred to as this at the top level, in a
// property on our prototype, so we can refer to it in our object's methods
myClass.prototype.global = this
// create a global variable referring to an object
var myVar = new myClass()
myVar.myName() // returns "myVar"
请注意,这是一个丑陋的黑客行为,不应在生产代码中使用。如果有一个以上的变量引用一个对象,您就无法判断将得到哪个变量。它只搜索全局变量,因此如果变量是函数的局部变量,它将不起作用。通常,如果需要命名某个对象,则应在创建该对象时将该名称传递给构造函数

编辑:为了回应您的澄清,如果您需要能够从事件处理程序中引用某些内容,您不应该按名称引用它,而是添加一个直接引用该对象的函数。这里有一个我快速举出来的例子,它展示了一些类似的东西,我认为,你正在尝试做的事情:

function myConstructor () {
  this.count = 0
  this.clickme = function () {
    this.count += 1
    alert(this.count)
  }

  var newDiv = document.createElement("div")
  var contents = document.createTextNode("Click me!")

  // This is the crucial part. We don't construct an onclick handler by creating a
  // string, but instead we pass in a function that does what we want. In order to
  // refer to the object, we can't use this directly (since that will refer to the 
  // div when running event handler), but we create an anonymous function with an 
  // argument and pass this in as that argument.
  newDiv.onclick = (function (obj) { 
    return function () {
      obj.clickme()
    }
  })(this)

  newDiv.appendChild(contents)
  document.getElementById("frobnozzle").appendChild(newDiv)

}
window.onload = function () {
  var myVar = new myConstructor()
}

您可以使用.toString()将构造函数转换为字符串:


您可以在函数中使用它,然后使用
toString()
检查函数的源代码,从而实现目标:


作为一种更基本的情况,如果
this
有一个属性可以引用它引用的变量(
heads
tails
),那就更好了,但不幸的是,它只引用新的
coinSide
对象的实例化

javascript:  /* it would be nice but ... a solution NOT! */
function coinSide(){this.ref=this};
/* can .ref be set so as to identify it's referring variable? (heads or tails) */
heads = new coinSide();
tails = new coinSide();
toss = Math.random()<0.5 ? heads : tails;
alert(toss.ref);
alert(["FF's Gecko engine shows:\n\ntoss.toSource()  is  ", toss.toSource()])
Firefox的Gecko引擎显示:

当然,在本例中,要解决
#1
,从而解决
抛投
,测试
抛投==正面
抛投==反面
非常简单。这个问题实际上是问javascript是否有一个
按名称调用
机制,这促使人们考虑对应的机制,是否有一个
按值调用
机制来确定变量的实际值?该示例演示了
heads
tails
的“值”是相同的,但是
alert(heads==tails)
false

可以按如下方式强制自引用:
(避免解决方案中提到的对象空间搜索和可能的歧义)

所以,按照规定

javascript:
  function bindDIV(objName){ 
    return eval( objName +'=new someObject("'+objName+'")' )
  };
  function someObject(objName){
    this.div="\n<DIV onclick='window.opener."+   /* window.opener - hiccup!! */
               objName+
             ".someFunction()'>clickable DIV</DIV>\n";
    this.someFunction=function(){alert(['my variable object name is ',objName])}
  };
  with(window.open('','test').document){         /*     see above hiccup    */
    write('<html>'+
      bindDIV('DIVobj1').div+
      bindDIV('DIV2').div+
      (alias=bindDIV('multiply')).div+
      'an aliased DIV clone'+multiply.div+
      '</html>');
    close();
  };
  void (0);
javascript:
函数bindDIV(objName){
返回eval(objName+'=newsomeobject(“+objName+”))
};
函数someObject(objName){
this.div=“\n可单击的div\n”;
this.someFunction=function(){alert(['my variable object name is',objName])}
};
使用(window.open(“”,'test').document){/*参见上面的hiccup*/
写(“”)+
bindDIV('DIVobj1').div+
bindDIV('DIV2').div+
(别名=bindDIV('multiply')).div+
“别名DIV克隆”+multiply.DIV+
'');
close();
};
无效(0);
有没有更好的办法


“更好”和“更容易”一样?更容易编程?更容易理解?更简单,执行速度更快?还是像“…现在是完全不同的东西”

如果你不想像Brian的回答那样使用函数构造函数,你可以使用Object.create():-

var myVar = {
count: 0
}

myVar.init = function(n) {
    this.count = n
    this.newDiv()
}

myVar.newDiv = function() {
    var newDiv = document.createElement("div")
    var contents = document.createTextNode("Click me!")
    var func = myVar.func(this)
    newDiv.addEventListener ? 
        newDiv.addEventListener('click', func, false) : 
        newDiv.attachEvent('onclick', func)
    newDiv.appendChild(contents)
    document.getElementsByTagName("body")[0].appendChild(newDiv)
}

myVar.func = function (thys) {
   return function() {
      thys.clickme()
   }
} 

myVar.clickme = function () {
   this.count += 1
   alert(this.count)
}

myVar.init(2)

var myVar1 = Object.create(myVar)
myVar1.init(55) 

var myVar2 = Object.create(myVar)
myVar2.init(150) 

// etc
奇怪的是,我无法使用newDiv.onClick实现上述功能,但它可以使用newDiv.addEventListener/newDiv.attachEvent

由于Object.create是一个新的版本,所以在旧版本浏览器(包括IE8)中包含以下来自Douglas Crockford的代码

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o
        return new F()
    }
}

实例化对象后,可以立即将属性(例如
名称
)附加到对象,并为其指定所需的字符串值:

var myObj = new someClass();
myObj.name="myObj";

document.write(myObj.name);
或者,可以在类的代码中进行赋值,
javascript:
function assign(n,v){ eval( n +"="+ v ); eval( n +".ref='"+ n +"'" ) }
function coinSide(){};
assign("heads", "new coinSide()");
assign("tails", "new coinSide()");
toss = Math.random()<0.5 ? heads : tails;
alert(toss.ref);
 javascript:
     item=new Object(); refName="item"; deferAgain="refName";
     alert([deferAgain,eval(deferAgain),eval(eval(deferAgain))].join('\n'));
javascript:
  function bindDIV(objName){ 
    return eval( objName +'=new someObject("'+objName+'")' )
  };
  function someObject(objName){
    this.div="\n<DIV onclick='window.opener."+   /* window.opener - hiccup!! */
               objName+
             ".someFunction()'>clickable DIV</DIV>\n";
    this.someFunction=function(){alert(['my variable object name is ',objName])}
  };
  with(window.open('','test').document){         /*     see above hiccup    */
    write('<html>'+
      bindDIV('DIVobj1').div+
      bindDIV('DIV2').div+
      (alias=bindDIV('multiply')).div+
      'an aliased DIV clone'+multiply.div+
      '</html>');
    close();
  };
  void (0);
var myVar = {
count: 0
}

myVar.init = function(n) {
    this.count = n
    this.newDiv()
}

myVar.newDiv = function() {
    var newDiv = document.createElement("div")
    var contents = document.createTextNode("Click me!")
    var func = myVar.func(this)
    newDiv.addEventListener ? 
        newDiv.addEventListener('click', func, false) : 
        newDiv.attachEvent('onclick', func)
    newDiv.appendChild(contents)
    document.getElementsByTagName("body")[0].appendChild(newDiv)
}

myVar.func = function (thys) {
   return function() {
      thys.clickme()
   }
} 

myVar.clickme = function () {
   this.count += 1
   alert(this.count)
}

myVar.init(2)

var myVar1 = Object.create(myVar)
myVar1.init(55) 

var myVar2 = Object.create(myVar)
myVar2.init(150) 

// etc
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o
        return new F()
    }
}
var myObj = new someClass();
myObj.name="myObj";

document.write(myObj.name);
var someClass = function(P)
{ this.name=P;
  // rest of the class definition...
};

var myObj = new someClass("myObj");
document.write(myObj.name);
+function(){
    var my_var = function get_this_name(){
        alert("I " + this.init());
    };
    my_var.prototype.init = function(){
        return my_var.name;
    }
    new my_var();
}();
function GetObjectName(myObject){
    var objectName=JSON.stringify(myObject).match(/"(.*?)"/)[1];
    return objectName;
}