Исчезающая функция объекта? - PullRequest
1 голос
/ 11 июня 2010

Есть ли причина, по которой функции объекта должны быть отключены или удалены, или просто не применяются по какой-либо причине, которая не является преднамеренной?

Я поддерживаю чей-то другой код и много раз его просматривал.Я использую Google Chromes удивительный отладчик, а также TextMate.Это помогает мне найти источник ошибки относительно быстро.

Теперь у меня проблема в том, что у меня есть объект: типы.Этот объект содержит ... типы.И эти типы имеют функции и другие переменные, связанные с ними.

По какой-то причине в середине кода этот тип был передан по ссылке, вероятно, миллионы раз.Когда дело доходит до определенной части кода, кажется, что она исчезла.Слоеное!И это ушло ..!

У кого-нибудь есть подсказка (кроме того, что она была удалена где-то ранее в коде, я уже ищу это)

Пример

Прямо сейчас я просто добавляю функции на лету.Не нравится, хотя, чувствую себя немного неуправляемым код:

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

1 Ответ

1 голос
/ 11 июня 2010

Нет, свойства объектов не будут загадочно исчезать без причины - по крайней мере, не исключая ошибок реализации, которые следует легко исключить, посмотрев, происходит ли то же самое в 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];
    }
}

Но, опять же, это не подразумевается, это явно.Но если он где-то спрятан в рабочей функции, его будет довольно легко пропустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...