Pull to refresh

Getters & Setters в IE5+

Reading time2 min
Views2.4K
Вот этим навеяло habrahabr.ru/blogs/javascript/66242

Вопреки расхожему мнению ИЕ все таки умеет назначать аксессоры, правда только в VB, чего для некоторых задач вполне достаточно.

<script language="vbscript">
' Объявляем класс, экземпляр которого в последствии будем использовать из яваскрипта
Class Accessor
  Public Property Let hook(val)  ' объявляем сеттер для свойства hook класса Accessor
   MsgBox val
  End Property
End Class

Dim access ' объявление переменных в VB обязательно
Set access = New Accessor  ' создаем экземпляр класса Accessor
</script>

<script language="jscript">
// т.к. у VB и JS общее пространство имен, можно вполне использовать созданный ранее access
access.hook = 'ololo';
</script>


* This source code was highlighted with Source Code Highlighter.


Другими словами аксессоры есть в VB, VB есть во всех IE и пространство имен VB и JS общее, можно пользовать.

Для моей задачи хватило вот такой обертки:

<script>
// Если в документе первым будет идти блок VB, то все остальные скрипты без атрибута language IE будет обрабатывать как VB
</script>

<script language="vbscript">
Class Accessor
  Public Property Let hook(val)
   propset val  ' при изменении свойства hook будет вызывать яваскриптовую функцию propset
  End Property
End Class
Dim access
Set access = New Accessor
</script>


<script>
function propset(val) {  // тут будем обрабатывать новые значения
  alert(val);
}
if(/*@cc_on!@*/true) {  // для остальных браузеров объявим аналог Accessor средствами javascript
  access = {};
  access.__defineSetter__('hook', function(val) {propset(val)})
}

access.hook = 'hi'// и наконец проверяем работоспособность сеттера
</script>


* This source code was highlighted with Source Code Highlighter.


К сожалению не без ложки дегтя, присваиваемые значения могут быть только скалярными, любые объекты приведут к ошибке:

access.hook = {};  // Ошибка: Объект не поддерживает это свойство или метод

* This source code was highlighted with Source Code Highlighter.


Вообще не знаток VB и тонкостей его реализации, возможно эту проблему можно как то обойти?

UPD: Присваиваемые значения могут быть не только скалярными, спасибо keksn, для этого Accessor должен быть объявлен следующим образом:
Class Accessor
  Public Property Let hook(val)
    propset val
  End Property
  Public Property Set hook(val)
    propset val
  End Property
End Class
Dim access
Set access = New Accessor


* This source code was highlighted with Source Code Highlighter.
Tags:
Hubs:
Total votes 44: ↑31 and ↓13+18
Comments10

Articles