不,对象的属性不会无缘无故地神秘消失——至少,不排除实现错误,这应该很容易通过查看 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];
}
}
但同样,这不是隐含的,这是明确的。但如果它隐藏在某个工作函数中,就很容易错过。