質問

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

私は他の人のコードをメンテナンスしていて、何度もそれを経験しました。私は Google Chrome の素晴らしいデバッガーと TextMate を使用しています。これらは、エラーの原因を比較的早く見つけるのに役立ちます。

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

何らかの理由で、コードの途中で、この型はおそらく何百万回も参照によって渡されています。コードの特定の部分に関しては、その部分が消えてしまったように見えます。パフ!そして消えてしまった…!

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

現時点では、その場で関数を追加しているだけです。ただし、気に入らないのですが、コードが少し制御不能になっているように感じます。

if(identifier.kind.hasOwnProperty('getWarning')) {
    identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
役に立ちましたか?

解決

いいえ、オブジェクトのプロパティが理由もなく不思議に消えることはありません。少なくとも、実装上のバグを除けば、IE、Chrome、Firefox で同じことが起こるかどうかを確認することで簡単に除外できるはずです。IE、Chrome、Firefox にはそれぞれ独自のものがあります (そして非常に異なります) 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];
    }
}

しかし、繰り返しますが、これは暗黙的なものではなく、明示的なものです。しかし、それがワーカー関数のどこかに隠されている場合、見落とすのは非常に簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top