En tant que plus élémentaires de la situation, il serait bien SI this
avaient une propriété qui pourrait de référence c'est en se référant variable (heads
ou tails
) mais malheureusement il ne les références de l'instanciation de la nouvelle - coinSide
objet.
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()])
qui affiche toujours
[object Object]
et Firefox Gecko le moteur montre:
toss.toSource() is ,#1={ref:#1#}
Bien sûr, dans cet exemple, pour résoudre #1
, et par conséquent toss
, il est assez simple de test toss==heads
et toss==tails
. Cette question, qui est vraiment se demander si le javascript est un call-by-name
mécanisme, qui motive l'examen de la contrepartie, est-il un call-by-value
mécanisme pour déterminer la valeur RÉELLE d'une variable? Cet exemple montre que les "valeurs" de la les deux heads
et tails
sont identiques, pourtant, alert(heads==tails)
est false
.
L'auto-référence peut être imposée comme suit:
(en évitant l'objet de l'espace de chasse et les ambiguïtés possibles, comme indiqué dans le Comment obtenir de la classe nom de l'objet comme une chaîne de caractères en Javascript? la solution)
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);
pour afficher heads
ou tails
.
C'est peut-être un anathème à l'essence de Javascript est le langage de conception, comme une interprétation d'une prototypage fonctionnel de la langue, d'avoir de telles capacités, comme primitives.
Une dernière considération:
javascript:
item=new Object(); refName="item"; deferAgain="refName";
alert([deferAgain,eval(deferAgain),eval(eval(deferAgain))].join('\n'));
donc, comme prévu ...
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);
Est-il une meilleure façon ... ?
"mieux", comme dans la plus facile? Plus facile à programmer? Plus facile à comprendre? Plus facile que dans une exécution plus rapide? Ou est-ce que dans "... et maintenant pour quelque chose de complètement différent"?