2010-12-14 6 views
1

Laquelle des deux manières suivantes est préférable d'appeler la propriété Color et pourquoi? Ou cela fait-il une différence?utilisation correcte de javascript de "this"

lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 

OU

lineSymbolizer:{strokeColor: LatLongLines.Color, strokeWidth: 2, strokeOpacity: 0.7}, 

Contexte CODE:

var LatLongLines = { 
    Graticule: null, 
    Color: "#000000", 
    Show: function() { 
     this.Graticule.activate(); 
    }, 
    Hide: function() { 
     this.Graticule.deactivate() 
    }, 
    Initialize: function() { 
     this.Graticule = new OpenLayers.Control.Graticule({ 
      numPoints: 2, 
      labelled: true, 
      lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 
      labelSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7} 
     }); 

     map.addControl(this.Graticule); 
    } 
}; 

Répondre

1

Personnellement, je serais probablement bâton avec this.Color. Si vous faites cela, alors les choses continueraient à fonctionner si vous décidiez un jour de cloner l'objet "LatLongLines". Le Tao de this est assez impliqué, mais dans ce cas il s'agira de l'objet contextuel lié d'appeler la fonction "through" la référence "LatLongLines". Si ces fonctions peuvent s'éloigner de l'objet d'origine, alors des mesures doivent être prises pour conserver une mémoire de l'objet de contexte afin qu'il soit correct lors de l'invocation, mais c'est une complication non évidente dans tout ce que vous avez posté.

+1

+1 Il semblerait techniquement plus efficace puisqu'il s'agit d'une référence directe à l'objet. Utiliser son nom semblerait exiger une recherche appropriée à travers chaque couche de variables et de propriétés. Est-ce que ça sonne bien? – user113716

+0

Eh bien oui, je suppose que c'est vrai, @patrick dw. – Pointy

0

Ce code ne fonctionnera pas comme prévu.

Votre LatLongLines est un objet simple, mais thisseulement travaux sur instances.

obj.method() 
    ^----- DOT determines the value of this inside the called function 
      If obj is an instance it will be used as 'this' otherwise 
      'this' will default to the global 'window' object 

Alors, soit:

  • Vous vous débarrasser de tous les this et utiliser LatLongLines au lieu d'avoir un objet global
  • Ou vous créez une instance LatLongLines, de cette façon this fonctionnera, vous pouvez toujours aller pour un singleton (Mais vous savez singleton est toujours l'état global, et l'état global est le mal)

Si vous avez besoin de créer une nouvelle instance faire quelque chose le long de ces lignes:

function LatLongLines() { 
    this.Graticule = null; 
    this.Color = "#000000"; 
}; 


// Let's use prototypical inheritance, these functions are shared between all 
// LatLongLines instances, of course the this always refers the specific instance that was called 
LatLongLines.prototype = { 
    Show: function() { 
     this.Graticule.activate(); 
    }, 

    Hide; function() { 
     this.Graticule.deactivate() 
    }, 

    Initialize: function() { 
     this.Graticule = new OpenLayers.Control.Graticule({ 
      numPoints: 2, 
      labelled: true, 
      lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 
      labelSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7} 
     }); 

     // Maybe you want to pass map in? :) 
     map.addControl(this.Graticule); 
    } 
}; 

var someLines = new LatLongLines(); 
+0

Peut-être que je vous ai mal compris, mais je ne suis pas sûr de ce que vous entendez par «ceci» ne fonctionne que sur les instances *. Je veux dire, je suppose que c'est vrai, mais 'LatLongLines' * fait référence à une instance. C'est juste une instance d'un simple 'Object'. [Voici un exemple de travail.] (Http://jsfiddle.net/patrick_dw/cpf7C/) S'il vous plaît laissez-moi savoir si je suis totalement mal interpréter ce que vous vouliez dire. – user113716

+0

les deux fonctionnent bien. this.Color et LatLongLines.Color. Je me demande juste ce qui est mieux. Ou si quelque chose aurait tort d'utiliser. – capdragon

+0

Désolé, poster juste en revenant du dentiste est une mauvaise idée ... oui bien sûr les deux vont marcher, j'irais bien avec 'LatLongLines', puisqu'il s'agit d'un objet global unique, et cela le rendrait plus clair , en utilisant 'this' implique toujours qu'il pourrait y avoir plusieurs de ces objets. –

0

En Javascript, this fait toujours référence à l'élément à gauche du point. Dans cet exemple, vous pouvez voir la même fonction étendue à deux objets this différents.

myObject = { 
    myFunction: function() { 
     console.log(this); // in FF or WebKit 
    } 
}; 

myObject.myFunction(); // this = myObject 

// Now we'll store a reference to our function and call 
// it without the dot notation. 
myFunc = myObject.myFunction; 

myFunc(); // this = window 

Je vous conseille l'utilisation LatLongLines.Color si vous n'êtes pas sûr du contexte de this pour assurer l'accès à la propriété Color de LatlongLines.

Questions connexes