作为一个更基本的情况,如果
this
有一个属性可以引用它的引用变量(
heads
或
tails
),那就太好了,但不幸的是它只引用新的
coinSide
对象的实例化。
javascript:
function coinSide(){this.ref=this};
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()])
始终显示的内容
[object Object]
而 Firefox 的 Gecko 引擎显示:
toss.toSource() is ,
当然,在这个例子中,要解决
#1
,从而得到
toss
,只需测试
toss==heads
和
toss==tails
。这个问题实际上是在询问JavaScript是否有一个
按名称调用
的机制,这激发了对于相应的问题的考虑,即有没有一个
按值调用
的机制来确定变量的实际值?该示例演示了
heads
和
tails
的“值”是相同的,但是
alert(heads==tails)
为
false
。
自我引用可以强制转换如下:
(避免对象空间查找和可能存在的歧义,如
如何在JavaScript中将类对象的名称作为字符串获取?中所述)
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 的语言设计来说,作为一种解释型原型化函数式语言,拥有这样的基本功能可能是违背其本质的。
最后需要考虑的是:
javascript:
item=new Object(); refName="item"; deferAgain="refName";
alert([deferAgain,eval(deferAgain),eval(eval(deferAgain))].join('\n'));
so, as stipulated ...
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);
有没有更好的方式...?
"better"指更容易吗?更容易编程吗?更容易理解吗?更容易执行速度快吗?还是指“...现在换个完全不同的东西”?
nameof(myObj)
的方式来获取字符串 "myObj"。 - styfle