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