消失的物体功能?

时间:2010-06-10 22:08:59

标签: javascript javascript-objects

是否有理由将对象功能设置为未设置或删除,或者根本没有因任何原因而无法应用这些功能?

我正在维护别人的代码并经历了很多次。我使用Google Chromes很棒的调试器和TextMate。这些帮助我找到错误的起源相对较快。

我现在遇到的问题是我有一个对象:类型。该对象包含...类型。这些类型附加了函数和其他变量。

由于某些原因,在代码中间,这种类型可能已经被引用传递了数百万次。当谈到代码部分的某些部分时,似乎已经消失了。噗!它已经消失了......!

任何人都有线索(除了在代码中的其他地方删除它,我已经在寻找它了)

实施例

现在我只是简单地添加功能。不喜欢它,感觉有点失控的代码:

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

1 个答案:

答案 0 :(得分:1)

不,对象的属性不会无缘无故地神秘消失 - 至少,不会禁止实现错误,应该通过查看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;
}

这是对象的“浅层”副本,只复制它在其上设置的属性本身,并忽略它从原型获取的任何属性。大多数(但绝不是全部)属性对象从其原型 tend 继承为函数,因此其结果似乎只是一个数据副本。例如:

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];
    }
}

但同样,这不是隐含的,这是明确的。但如果它隐藏在某个工作者的某个地方,那么很容易错过。