是否有理由取消设置或删除对象函数,或者出于任何非故意的原因根本不应用对象函数?
我正在维护别人的代码并检查了很多次。我使用 Google Chrome 出色的调试器和 TextMate。这些帮助我相对快速地找到错误的根源。
我现在遇到的问题是我有一个对象:类型。该对象包含...类型。这些类型附加有函数和其他变量。
由于代码中间的某种原因,该类型可能已通过引用传递了数百万次。当涉及到某部分代码的时候,它的部分似乎已经消失了。噗!然后它就消失了..!
任何人都有线索(除了在代码中较早的其他地方被删除之外,我已经在寻找)
示例
现在我只是即时添加功能。但不喜欢它,感觉代码有点失控:
if(identifier.kind.hasOwnProperty('getWarning')) {
identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
最佳答案
不,对象的属性不会无缘无故地神秘消失——至少,不排除实现错误,通过查看 IE、Chrome 和 Firefox 中是否发生同样的情况,应该可以轻松排除这些错误,每个浏览器都有自己的特点自己的(并且非常不同的)Javascript 实现。
如果这些层中的任何一个间接发生,那就是另一回事了。例如,如果在某个时刻将对象序列化为 JSON 字符串,然后重新构造它,则结果将是一个几乎所有属性都绑定(bind)了数据的对象,但没有一个属性绑定(bind)了函数。但这不是传递引用,而是序列化和反序列化。
如果像这样进行复制,也会发生同样的事情:
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;
}
这会创建对象的“浅”副本,仅复制其本身设置的属性,并忽略从其原型(prototype)获取的任何属性。大多数(但绝不是全部)属性对象从其原型(prototype)继承往往是函数,因此其结果似乎是纯数据副本。示例:
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];
}
}
但是,这不是隐式的,而是显式的。但如果它隐藏在工作函数中的某个地方,就很容易被错过。
关于javascript - 消失的对象函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018907/