2010-11-23 7 views
0
<HTML> 
    <HEAD> 
     <SCRIPT LANGUAGE="JavaScript"> 
     function Peon(number) { 
      this.number = number; 

      this.inc = function() { 
       number=number+1; 
      }; 

      return true; 
     } 
     var p=new Peon(10); 

     function returnNumber() { 
      p.inc(); 
      alert(p.number); 
     } 
     </SCRIPT> 
    </HEAD> 
    <BODY> 

     <INPUT id="b00" TYPE="button" Value="Click" onClick="returnNumber()"> 

    </BODY> 
    </HTML> 

Ce code ne fonctionne pas comme prévu. Est-il un moyen de le faire fonctionner sans avoir à écrireAccès aux variables dans les objets en javascript sans "this"

this.number=this.number+1; 

Ici, il est un choix trivial, mais dans les grands codes ne pas avoir cela. *, Il serait beaucoup plus facile à lire. C'est possible?

Répondre

2

Vous pouvez faire number "privé", mais il vous faut un getter:

function Peon(number) { 
     var number = number; 

     // increment 
     this.inc = function() { 
      number++; 
     }; 

     // a simple getter 
     this.getNumber = function() { 
      return number; 
     } 
    } 
    var p = new Peon(10); 
    p.inc(); 
    alert(p.getNumber()); 

Vous devriez lire Douglas Crockfords « The Good Parts Pour plus d'informations sur l'utilisation de ce modèle, un aperçu (limité) est disponible au Google Books.

De même, vous n'avez pas besoin de renvoyer quelque chose au constructeur, votre return true est superflu.

+2

Vous pouvez lire à propos du modèle privé de Crockford sur son site: http://javascript.crockford.com/private.html Il est ** très important de noter que si vous allez avoir beaucoup de Peons, ce modèle de membre privé consomme nettement plus de mémoire que d'utiliser une propriété, car chaque objet individuel aura sa propre copie des deux fonctions. défini dans le constructeur. Ils ne sont pas et ne peuvent pas être partagés entre des objets. Donc, le compromis est la confidentialité v. Utilisation de la mémoire. La consommation de mémoire est un problème majeur sur IE et Firefox. Si vous n'allez avoir que quelques Peons, cela n'a pas d'importance. –

+0

Merci, c'est ce que je cherchais –

+0

'return true' est en effet superflu et essentiellement ignoré à la fin d'un constructeur, mais retourner un objet plutôt qu'une primitive ne serait pas ignoré et retournerait cet objet plutôt que le nouveau' Peon' objet. –

0

Pas vraiment, mais cela est un peu plus concise

this.number++ 

En fait, comme une note de côté, vous feriez mieux de déclarer .inc en dehors du constructeur de Peon. Vous pourriez le faire avec un prototype. De cette façon, la fonction inc n'est pas reconstruite à chaque fois que vous créez un objet de type Peon.

Peon.prototype.inc = function(){ 
    this.number++; 
} 

Ou au lieu d'utiliser p.inc() que vous pourriez faire p.number++. C'est la seule façon dont je peux penser à éviter ce mot-clé.

0

La seule façon lisible que je peux voir le faire serait:

this.inc = function() { 
    this.number++; 
}; 

Sinon, dans votre postulation, vous pourriez faire quelque chose comme "plus gros codes" ceci:

this.inc = function() { 
    var number = this.number; // obviously simple here. Imagine more complexity 
    number++; 
}; 
+0

Désolé mais votre deuxième suggestion cela ne fonctionne pas ... –

1

Non, devez utiliser this pour référencer les propriétés sur l'objet this. Notez que this en JavaScript est très différent de this dans d'autres langages, comme C ou Java. Plus here et here. Ce que fait votre code, c'est d'accéder à l'argument number qui a été transmis à la fonction constructeur Peon, plutôt qu'à la propriété this.number que vous avez créée dans le constructeur. C'est pourquoi cela ne fonctionne pas comme prévu, mais n'échoue pas non plus.

Il n'y a aucune raison de définir votre inc opération au sein la fonction constructeur Peon, BTW, et quelques bonnes raisons de ne pas (chaque objet individuel créé par Peon aura sa propre copie de cette fonction). Ainsi, au lieu, vous pouvez le définir comme ceci:

function Peon(number) { 
    this.number = number; 

    // Don't return values out of constructor functions, it's 
    // an advanced thing to do. In your case, you were returning 
    // `true` which was being completely ignored by the JavaScript 
    // interpreter. If you had returned an object, the `this` object 
    // created for the `new Peon()` call would have been thrown away 
    // and the object you returned used instead. 
} 

Peon.prototype.inc = function() { 
    ++this.number; 
}; 

var p=new Peon(10); 

function returnNumber() { 
    p.inc(); 
    alert(p.number); // alerts 11 
} 
+0

+1 à vous et @ Ivo. La combinaison des deux fait une excellente réponse globale. – Matt

+0

comme une note latérale - pourquoi ++ this.number au lieu de this.number ++? Je sais qu'ils évaluent légèrement différemment, mais dans ce cas d'utilisation serait interchangeable. Juste curieux puisque j'ai tendance à voir le this.number ++ former plus fréquemment. – Matt

+0

@Matt: Ma langue maternelle est l'anglais, dans lequel "verbe-nom" est un modèle de discours nettement plus commun que "nom-verbe", et j'écris donc "increment x" ("++ x") plutôt que "x" incrément "(" x + + "). Si j'étais allemand, je pense que j'écrirais «x ++». :-) Dans la grande majorité des cas, il n'y a pas de différence * dans le monde réel *. (J'insiste sur le "monde réel" parce que sinon les rôdeurs vont bondir et essayer de micro-optimiser. :-)) –

0

Oui, vous n'avez pas besoin d'utiliser 'ceci' en javascript.Vous pouvez accéder à des variables via la fermeture au lieu de « cette »

function createPeon(number) { 
 

 
    function inc() { 
 
     number=number+1; 
 
    }; 
 
    function getNumber() { 
 
     return number; 
 
    } 
 

 
    return { inc, getNumber }; 
 
} 
 
var p=createPeon(10); 
 
p.inc(); 
 
alert(p.getNumber());

Questions connexes