Три вещи, которые могут помочь:
1) Во-первых, я думаю, что вам не хватает этой строки в верхней части вашей myobject
функции:
this.svgshape = svgshape;
Япредполагая, что это была просто ошибка при отправке вопроса и вставили его ниже.
2) Обычно, когда вы используете Prototype (или любую современную библиотеку), вы не используете строки для обратных вызовов, вы используете Функция .Кроме того, вы обычно назначаете обработчики, используя оболочку библиотеки для addEventListener
/ attachEvent
(observe
, в случае с Prototype), а не со старым атрибутом DOM0.Итак:
function myobject(svgShape) {
this.svgshape = svgshape;
$(this.svgshape).observe('click', this.doSomething); // STILL WRONG, see below
}
myobject.prototype.doSomething = function() {
alert("works");
}
3) Но в JavaScript нет методов (они на самом деле не нужны), он просто имеет функции, поэтому приведенное выше не гарантирует, что this
( контекст вызова) установлен правильно.С Prototype вы бы использовали bind
для установки контекста:
function myobject(svgShape) {
this.svgshape = svgshape;
$(this.svgshape).observe('click', this.doSomething.bind(this));
}
myobject.prototype.doSomething = function() {
alert("works");
}
(или вы можете использовать собственное закрытие для этого. Преимущество bind
в том, чтозамыкание находится в очень хорошо контролируемой среде и поэтому не закрывается над вещами, которые вы не хотите хранить.)
Теперь я никогда не занимался программированием SVG с помощью Prototype, поэтому, если observe
по какой-то причине не работает, вы можете попытаться напрямую присвоить отраженное свойство onclick
:
function myobject(svgShape) {
this.svgshape = svgshape;
this.svgshape.onclick = this.doSomething.bind(this);
}
myobject.prototype.doSomething = function() {
alert("works");
}
Я все еще использую bind
, поэтому this
имеет правильное значение.
Эти посты из моего анемичного небольшого блога более подробно обсуждают вышеперечисленное: