1

オブジェクト関数が設定解除または削除されたり、意図的ではない理由で単に適用されなかったりする理由はありますか?

私は他の誰かのコードを維持していて、何度もそれを経験しています。私はGoogleChromeのすばらしいデバッガーとTextMateを使用しています。これらは、エラーの原因を比較的早く見つけるのに役立ちます。

私が今抱えている問題は、私がオブジェクトを持っているということです:タイプ。このオブジェクトには...タイプが含まれています。そして、これらの型には関数やその他の変数が付加されています。

何らかの理由でコードの途中で、このタイプはおそらく何百万回も参照によって渡されています。それのコード部分の特定の部分になると、消えたようです。パフ!そして、それはなくなった..!

誰もが手がかりを持っています(コードの早い段階で削除されていることを除いて、私はすでにそれを探しています)

今、私は単にその場で関数を追加しています。しかし、それが気に入らない場合は、コードを少し制御できなくなっていると感じます。

if(identifier.kind.hasOwnProperty('getWarning')) {
    identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
4

1 に答える 1

1

いいえ、オブジェクトのプロパティが理由もなく不思議に消えることはありません。少なくとも、実装のバグを除けば、それぞれ独自の(および非常に異なる)Javascriptの実装。

ただし、これらのレイヤーのいずれかが間接的に発生する場合、それは別の問題です。たとえば、ある時点でオブジェクトをJSON文字列にシリアル化してから再構成すると、結果は、データがバインドされたほぼすべてのプロパティを持つオブジェクトになりますが、関数がバインドされたプロパティはありません。しかし、それは参照を渡すのではなく、シリアル化と逆シリアル化です。

何かが次のようなコピーを作成している場合も、同じことが起こる可能性があります。

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

たとえば、データのみのコピーを作成するもの。何かがこれを行う場合、それはあまり明白ではない可能性もあります:

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

これにより、オブジェクトの「浅い」コピーが作成され、オブジェクト自体に設定されたプロパティのみがコピーされ、プロトタイプから取得したプロパティはすべて無視されます。オブジェクトがプロトタイプから継承するプロパティのほとんど(すべてではありません)は関数である傾向があるため、その結果はデー​​タのみのコピーのように見える可能性があります。例:

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,

もちろん、関数を参照するオブジェクトからプロパティを削除することもできます。

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

しかし、繰り返しになりますが、それは暗黙的ではなく、明示的です。しかし、それがどこかのワーカー関数に隠されていると、見逃しがちです。

于 2010-06-10T22:16:49.333 に答える