попробуйте получить событие, используя переданный параметр (в данном случае названный e
). Я проверил это, и оба window.event
и e
поддерживаются в Chrome.
попробуйте проверить оба типа, в зависимости от того, что существует
var ex = {
exampl: function(e){
console.log(window.event);
console.log(e);
//check if we have "e" or "window.event" and use them as "evt"
var evt = e || window.event
}
}
Причина в том, что он может вычислять смещения переменных для подклассов.
@interface Bird : NSObject {
int wingspan;
}
@end
@interface Penguin : Bird {
NSPoint nestLocation;
Penguin *mate;
}
@end
Не зная структуры класса "Bird", класс "Penguin" не может вычислить смещение его поля с начала структуры. Структура пингвина выглядит примерно так:
struct Penguin {
int refcount; // from NSObject
int wingspan; // from Bird
NSPoint nestLocation; // from Penguin
Penguin *mate; // from Penguin
}
У этого есть побочный эффект: если вы измените размер класса в библиотеке, вы сломаете все подклассы в приложениях, которые связаны с этой библиотекой. Новые свойства позволяют обойти эту проблему.
Хотя они объявлены в файле заголовка, все переменные экземпляра в Objective-C имеют доступ @protected по умолчанию. Это означает, что переменная доступна в классе, который объявляет ее, и в любом классе, наследующем от этого класса.
Вот документация Apple по определению класса Objective-C: Определение классов
Обратите внимание на раздел под названием «Область действия» переменных экземпляра ".
Я думаю, что это техническая проблема. Если я правильно понимаю, класс Objective-C - это просто причудливая структура C. А для использования структуры необходимо знать ее размер. (Например, как бы в противном случае работал sizeof ())
Взято из раздела документации Apple по определению классов Objective-C, Роль интерфейса :
Хотя переменные экземпляра наиболее естественно рассматриваются как реализация класса, а не его интерфейса, они, тем не менее, должны быть объявлены в файле интерфейса. Это потому, что компилятор должен знать структуру объекта, в котором он используется, а не только то, где он определен.
Обратите внимание, что в Objective C 2.0 новая «Современная среда выполнения» (доступна в приложениях iPhone и 64-битных приложениях Mac OS X 10.5) вам не нужно указывать ivars, вы можете указать properties, а затем используйте @synthesize для генерации ivar.
Это связано с тем, что в современной среде исполнения ivars имеют глобальный символ косвенного обращения, который содержит смещение для ivar. Это также решает проблему хрупкого базового класса, позволяя переупорядочивать и добавлять ivars без необходимости перекомпиляции подклассов (удаление или переименование ivars может по-прежнему вызывать ошибки связи).
Однако вам все равно нужно перечислить свойства в главном интерфейсе, поэтому там не похоже, чтобы полностью скрыть частные ivars, что прискорбно. Вы не можете, например, использовать свойство и @synthesize в категории.