2011-04-14 5 views
0

Fondamentalement, j'ai un objet:jQuery OO événement contraignant

function tomatoe(name, owner) { 
    $('<div>').click(this.squish).appendTo(myElement).text('I\'m a happy tomatoe called ' + name); 

    this.name = name; 
    this.dead = false; 
    this.owner = owner; 
    this.squish = function() { 
     console.log('Oh my Google, you killed ' + this.name + '!'); 
     this.dead = true; 
     this.owner.sad = true; 
    }; 
} 

La fonctionnalité est assez simple. Une fois instanciée, créez une div, attachez-y un gestionnaire de clic et agrafez-la sur quelque chose. À l'instanciation, deux paramètres sont passés: un nom et un propriétaire. Le propriétaire est une référence à un autre objet.

Il y a deux problèmes avec ce code:

  1. La cette référence dans la fonction Ecraser est brisé, car il se réfère maintenant à l'élément cliqué.
  2. En raison du chaînage, lors de la connexion de l'événement, "this" fait référence à jQuery ou à l'élément div nouvellement créé (pas encore sûr), donc ce.squish n'est pas défini et n'est jamais appelé.

Si cela aide d'une manière quelconque, l'objet propriétaire a une référence à toutes les tomates.

+0

* facepalm * Je suis comme un idiot ... créer une autre instance de vous-même est en OO JavaScript 101 – Zirak

+0

Toutes vos réponses sont correctes ... va laisser un générateur de nombres aléatoires décider lequel. – Zirak

+0

lol @ Zirak est habituellement le 1er correct qui obtient le gâteau :-p – Neal

Répondre

1

Vous voulez réaffecté this à un autre variable de sorte que la dénomination ne se heurte pas. C'est aussi une bonne idée de créer la div après avoir instancié toutes les variables.

function tomatoe(name, owner) { 
    var that = this; 

    that.name = name; 
    that.dead = false; 
    that.owner = owner; 
    that.squish = function() { 
     console.log('Oh my Google, you killed ' + that.name + '!'); 
     that.dead = true; 
     that.owner.sad = true; 
    }; 

    $('<div>').click(that.squish).appendTo(myElement).text('I\'m a happy tomatoe called ' + name); 

} 
+0

Vous gagnez le générateur de nombres aléatoires extrême.Merci et félicitations – Zirak

+0

@Zirak, vous réalisez que vous n'êtes pas vraiment censé choisir des réponses sur la pile – Neal

+0

@Neal Lorsque plusieurs réponses apparaissent dans un court laps de temps (comme une minute ou plus), toutes les réponses sont considérées comme authentiques. Le PO peut choisir n'importe laquelle de ces réponses. Ce serait différent si cette réponse était postée comme 10 minutes après une autre réponse tout aussi valable, mais ce n'est pas le cas ici. –

1

essayez ceci:

function tomatoe(name, owner) { 

    //make a reference to this with self 
    var self = this; 

    $('<div>').click(self.squish).appendTo(myElement).text('I\'m a happy tomatoe called ' + name); 

    this.name = name; 
    this.dead = false; 
    this.owner = owner; 
    this.squish = function() { 
     console.log('Oh my Google, you killed ' + this.name + '!'); 
     this.dead = true; 
     this.owner.sad = true; 
    }; 
} 

ce que je ferais si vous voulez chanability:

var tomato = { 
    name: null, 
    dead: null, 
    owner: null, 

    init: function(name, owner){ 
      var self = this; 
      $('<div>').click(self.squish) 
       .appendTo(myElement).text('I\'m a happy tomatoe called ' + name); 
      this.name = name; 
      this.dead = false; 
      this.owner = owner; 
      return this; 
    }, 

    squish: function(){ 
      console.log('Oh my Google, you killed ' + this.name + '!'); 
      this.dead = true; 
      this.owner.sad = true; 
      return this; 
    } 

} 

//to instantiate it: 
tomato.init(name, owner); 
+0

@Neal Vous avez oublié d'utiliser self au lieu de à l'intérieur de la fonction imbriquée ... –

+0

Sime, je crois que cela se réfère toujours à la correcte dans le fn imbriqué, je pourrais avoir tort si – Neal

+0

@Neal Oui, vous avez raison. Cependant, la ligne jQuery doit apparaître sous l'affectation 'this.squish'. Vous n'avez pas du tout besoin de créer la variable 'self' - à l'intérieur de' click() '' this' se réfère toujours à l'instance. –

1

Vous devez placer la ligne jQuery après l'affectation this.squish! Il est évidemment indéfini, jusqu'à ce que vous lui assigniez une valeur.

function tomatoe(name, owner) { 

    var that = this; 

    this.name = name; 
    this.dead = false; 
    this.owner = owner; 
    this.squish = function() { 
     console.log('Oh my Google, you killed ' + that.name + '!'); 
     that.dead = true; 
     that.owner.sad = true; 
    }; 

    $('<div>').click(this.squish).appendTo(myElement) 
       .text('I\'m a happy tomatoe called ' + name); 

} 
1

Eh bien, la meilleure façon de faire ce que vous voulez faire est de créer une variable locale pour stocker une référence à l'objet tomatoe comme ceci:

function tomatoe(name, owner) { 
    var _this = this; 
    $('<div>').click(this.squish).appendTo(myElement).text('I\'m a happy tomatoe called ' + name); 

    this.name = name; 
    this.dead = false; 
    this.owner = owner; 
    this.squish = function() { 
    console.log('Oh my Google, you killed ' + _this.name + '!'); 
    _this.dead = true; 
    _this.owner.sad = true; 
    }; 
}