作为一个更基本的情况,如果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()])
总是显示
[object Object]
和 Firefox 的 Gecko 引擎显示:
toss.toSource() is ,#1={ref:#1#}
当然,在本例中,要解析#1 和toss,测试toss==heads 和toss==tails 很简单。这个问题实际上是在询问 javascript 是否具有 call-by-name 机制,引发了对对应方的考虑,是否有 call-by-value 机制来确定变量的 ACTUAL 值?该示例演示了heads 和tails 的“值”是相同的,而alert(heads==tails) 是false。
自引用可以被强制如下:
(避免How to get class object's name as a string in 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);
显示heads 或tails。
作为一种解释型原型功能语言,拥有原语等功能,这可能是对 Javascript 语言设计精髓的一种厌恶。
最后的考虑:
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);
有没有更好的方法...?
“更好”更容易?更容易编程?更容易理解?更容易执行更快?还是像“...现在完全不同的东西”一样?