1

是否有理由取消设置或删除对象函数,或者出于任何非故意的原因根本不应用对象函数?

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

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

由于代码中间的某种原因,这种类型可能已经通过引用传递了数百万次。当涉及到某个部分的代码部分呢,好像都消失了。噗!它已经消失了..!

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

例子

现在我只是在动态添加功能。不过不喜欢,感觉代码有点失控:

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

1 回答 1

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

这会生成对象的“浅”副本,仅复制它在其上设置的属性本身,并忽略它从其原型获得的任何属性。大多数(但绝不是全部)对象从其原型继承的属性往往是函数,因此其结果似乎是仅数据副本。例子:

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

但同样,这不是隐含的,这是明确的。但如果它隐藏在某个工作函数中,就很容易错过。

于 2010-06-10T22:16:49.333 回答