Frage

Gibt es einen Grund für die Objektfunktionen aus irgendeinem Grunde nicht gesetzt oder gelöscht werden oder einfach nicht angewandt werden, die nicht beabsichtigt ist?

Ich bin Aufrechterhaltung jemand anderem Code und viele Male durchgegangen. Ich verwende Google Chromes genial Debugger und auch Textmate. Diese hilft mir, den Ursprung des Fehlers finden relativ schnell.

Das Problem, das ich jetzt habe ist, dass ich ein Objekt haben: Typen. Dieses Objekt enthält ... Typen. Und diese Typen haben Funktionen und andere mit ihnen verbundenen Variablen.

Aus irgendeinem Grunde in der Mitte des Codes, ist diese Art wurde vermutlich durch Bezugnahme millionenfach übergeben. Wenn es um einen bestimmten Teil der Code Teile davon kommt, scheint verschwunden zu sein. Puff! Und es ist weg ..!

Wer noch einen Hinweis (anders als es früher an anderer Stelle im Code entfernt wird, bin ich schon, dass suchen)

Beispiel

Im Moment bin ich einfach das Hinzufügen der Funktionen im laufenden Betrieb. Nicht es aber mögen, fühlen sich ein wenig außer Kontrolle des Codes:

if(identifier.kind.hasOwnProperty('getWarning')) {
    identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
War es hilfreich?

Lösung

Nein, Eigenschaften von Objekten werden nicht auf mysteriöse Weise ohne Grund verschwinden zu lassen - zumindest, abgesehen von nicht Implementierung Fehlern, die leicht durch Sehen ausgeschlossen werden sollen, wenn das gleiche geschieht in IE, Chrome und Firefox, die jeweils ihre eigene (und sehr unterschiedlich) Implementierungen von Javascript.

Wenn eine dieser Schichten geschieht indirekt , aber das ist eine andere Sache. Zum Beispiel, wenn an einem gewissen Punkt ist etwas, das Objekt zu einem JSON-String serialisiert und dann wiederherstellbaren, wird das Ergebnis ein Objekt sein, mit nahezu allen Eigenschaften mit Daten an sich gebunden, aber keinem von denen, mit Funktionen an sich gebunden. Aber das ist nicht eine Referenz um vorbei, das ist die Serialisierung und Deserialisierung.

Das Gleiche könnte passieren, wenn etwas eine Kopie wie folgt machen:

dest = {};
for (name in src) {
    value = src[name];
    if (typeof value !== "function") {
        dest[name] = value;
    }
}

z., So dass etwas nur Daten kopiert werden. Es kann auch weniger offensichtlich passieren, wenn etwas tut dies:

function clone(src) {
    dest = {};
    for (name in src) {
        if (src.hasOwnProperty(name)) {
            dest[name] = src[name];
        }
    }
    return dest;
}

Das macht eine „flache“ Kopie des Objekts, nur die Eigenschaften kopiert es auf sie festgelegt hat, selbst und ignorieren alle Eigenschaften, es von seinem Prototyp wird. Die meisten (aber keineswegs alle) der Eigenschaften von ihren Prototypen erben Objekte neigen Funktionen sein, und so das Ergebnis, dass scheinen kann ein Daten nur zu sein kopieren. Beispiel:

function Thingy() {
}
Thingy.prototype.foo = function() {
}
var t = new Thingy();
t.bar = 42;
// `t` has a `foo` function bound to it, indirectly through its prototype,
// and a `bar` property with the value 42
var x = clone(t);
// `x` does *not* have a `foo` function, but it does have a `bar` property,

Natürlich können Sie auch gerne löschen Eigenschaften von Objekten, die auf Funktionen beziehen:

for (name in obj) {
    if (typeof obj[name] === "function" && obj.hasOwnProperty(name)) {
        delete obj[name];
    }
}

Aber noch einmal, das ist nicht implizit, dass explizite ist. Aber wenn es in einer Arbeiter-Funktion irgendwo versteckt ist, wäre es ziemlich leicht zu übersehen sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top