Question

Y at-il une raison pour les fonctions d'objet à unset ou supprimé, ou tout simplement pas appliqué pour quelque raison que tout ce qui est pas intentionnel?

Je suis maintenant le code de quelqu'un et passé par plusieurs fois. J'utilise Google Chromes débogueur impressionnant et aussi TextMate. Ceux-ci me aider à trouver l'origine d'une erreur relativement rapide.

Le problème que j'ai maintenant que j'ai un objet: types. Cet objet contient ... types. Et ces types ont des fonctions et d'autres variables qui leur sont rattachés.

Pour une raison quelconque au milieu du code, ce type a été adoptée par des millions de références de temps probablement. Quand il vient à une certaine partie des parties de code de celui-ci, semblent avoir disparu. Bouffée! Et il est parti ..!

Quelqu'un at-il un indice (autre que étant retiré un autre endroit plus tôt dans le code, je suis à la recherche déjà pour cela)

Exemple

En ce moment je suis simplement d'ajouter des fonctions à la volée. Ne pas l'aimer bien, se sentir un peu hors de contrôle du code:

if(identifier.kind.hasOwnProperty('getWarning')) {
    identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
Était-ce utile?

La solution

Non, les propriétés des objets ne disparaissent mystérieusement sans raison - du moins, pas à l'exception des bugs de mise en œuvre, ce qui devrait être facilement exclue par voir si la même chose se produit dans Internet Explorer, Chrome et Firefox, qui ont chacun leur propres (et très différentes) implémentations de Javascript.

Si l'une de ces couches se produit indirectement , cependant, c'est une autre question. Par exemple, si à un moment donné quelque chose sérialisation l'objet à une chaîne JSON, puis le reconstituent, le résultat sera un objet avec presque toutes les propriétés des données qui leur sont liés, mais aucun de ceux avec des fonctions qui leur sont liés. Mais cela ne passe pas une référence autour, qui est sérialisation et désérialisation.

La même chose pourrait se produire si quelque chose fait une copie comme ceci:

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

par exemple., Quelque chose de faire une copie de données seulement. Il peut également se produire de façon moins évidente, si quelque chose fait ceci:

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

Cela fait une copie de « superficielle » de l'objet, la copie ne les propriétés qu'elle a mis sur elle, elle-même, et sans tenir compte des propriétés qu'elle obtient de son prototype. La plupart (mais pas tous) des propriétés de leurs projet d'objets héritent des prototypes ont tendance pour être des fonctions, et donc le résultat de cela peut sembler être une donnée-seule copie. Exemple:

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,

Bien sûr, vous pouvez également des propriétés des objets heureusement suppression qui se réfèrent à des fonctions:

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

Mais encore une fois, ce n'est pas implicite, qui est explicite. Mais si elle est cachée dans une fonction de travail quelque part, ce serait assez facile à manquer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top