Impossible de comprendre comment accéder aux propriétés "étendues" d'un objet enfant à partir d'un rappel dans le parent. Mes deux tentatives sont ci-dessous. Je voudrais pour la fonction "say_something" alerter "say hi", où "salut" vient de l'enfant. Au lieu de cela, il est dit "dis indéfini".JavaScript: lorsque B hérite de A, les rappels dans A ne peuvent pas voir B
Tentative 1: Je crée un objet "a", puis crée un nouvel objet "b" qui en dérive. Mais un rappel dans "a" (ici à partir d'un setTimeout) n'aura pas accès à la bonne "ceci".
var a = {};
a.say_something = function() { setTimeout(function() { alert("say " + this.text); }, 0); };
var b = Object.create(a);
b.text = "hi";
b.say_something(); // alerts "say undefined"
Tentative 2: La sagesse commune dit réarranger pour permettre une variable « que » accessible dans le rappel. Mais, contrairement à « ce », « qui » ne peut pas accéder aux propriétés de « b »:
var a = (function() {
var that = {};
that.say_something = function() { setTimeout(function() { alert("say " + that.text); }, 0); };
return that;
}());
var b = (function() {
var that = Object.create(a);
that.text = "hi";
return that;
}());
b.say_something(); // alerts "say undefined"
PS, j'utiliser la fonction Object.create de Douglas Crockford au lieu de la (source de confusion pour moi) nouvelle(). Il est copié ici:
if (typeof Object.create !== "function") {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
"Enregistrer la référence à * ceci * ceci" est ce qu'il a fait. Merci! Pour que mon code "Attempt 2" fonctionne, j'ai ajouté un * second * "var that = this;" directement avant l'appel à setTimeout, comme vous le suggérez. (Il ombrage/"écrase" le premier "var that = {};", que je continue à utiliser ailleurs) –