いいえ、オブジェクトのプロパティが理由もなく不思議に消えることはありません。少なくとも、実装のバグを除けば、それぞれ独自の(および非常に異なる)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];
}
}
しかし、繰り返しになりますが、それは暗黙的ではなく、明示的です。しかし、それがどこかのワーカー関数に隠されていると、見逃しがちです。