javascript - 消失的对象函数?

标签 javascript javascript-objects

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

我正在维护别人的代码并检查了很多次。我使用 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/

相关文章:

javascript - 如何在 jquery 中动态地将分隔符放入数组中?

javascript - 根据另一个包含 javascript 键的数组过滤对象数组

javascript - 循环遍历对象数组并返回每个对象的键和值

javascript 对象赋值抛出异常

javascript - ES6 : Can't Deconstruct inside a call constructor

javascript - 如何检查url字符串中的端口号?

javascript - 检测设备JS和切换类

javascript - 如何更改IE8中TextNode的textContent?

javascript - 确定带小数点和不带小数点的价格

javascript - 为什么 React 渲染的 DOM 节点不被 React.PropTypes.node 验证视为节点?