Kann nicht herausfinden, wie Zugriff auf die "erweiterten" Eigenschaften eines untergeordneten Objekts von einem Rückruf im übergeordneten Element erhalten. Meine zwei Versuche sind unten. Ich möchte für die Funktion "say_something" "say hi" alarmieren, wobei "hi" vom Kind kommt. Stattdessen heißt es "sag undefined".JavaScript: Wenn B von A erbt, können Callbacks in A B nicht sehen B
Versuch 1: Ich erstelle ein Objekt "a" und erstelle dann ein neues Objekt "b", das von ihm abgeleitet ist. Aber ein Callback in "a" (hier von einem setTimeout) hat keinen Zugriff auf das richtige "this".
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"
Versuch 2: Gemeinsame Weisheit sagt, neu ordnen für eine „die“ Variable zu ermöglichen, die in den Rückruf zugegriffen werden kann. Aber im Gegensatz zu "this", "dass" kein Zugriff auf Eigenschaften von "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, verwende ich Douglas Crockford Object.create Funktion anstelle der (verwirrend für mich) neue(). Es wird hier kopiert:
if (typeof Object.create !== "function") {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
"Speichern Sie den Verweis auf * dies * dies" ist, was es getan hat. Vielen Dank! Um meinen Code "Versuch 2" zu erhalten, habe ich ein * zweites * "var that = this;" direkt vor dem Aufruf von setTimeout, wie Sie vorschlagen. (Es überschattet/überschreibt das erste "var that = {};", das ich woanders weiter verwende) –