Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   javascript Harmonia и Proxy (https://javascript.ru/forum/offtopic/25725-javascript-harmonia-i-proxy.html)

Mахmахmахimus 13.02.2012 19:35

javascript Harmonia и Proxy
 
HarmoiaHarmony гармония блинXD

Что думаете по этому поводу? Это же жесть как мощно!
https://developer.mozilla.org/en/Jav..._Objects/Proxy

Octane 13.02.2012 21:15

А __noSuchMethod__ так и остался нестандартным?

Mахmахmахimus 13.02.2012 21:48

хз но пока это всего лишь черновик

Mахmахmахimus 14.02.2012 00:49

что такое __noSuchMethod__ ?

FINoM 15.02.2012 06:36

Цитата:

Сообщение от Mахmахmахimus
что такое __noSuchMethod__ ?

Это метод объекта, который вызывается, когда пытаются вызвать несуществующий метод.
https://developer.mozilla.org/en/Jav...t/NoSuchMethod

({
   __noSuchMethod__: function(meth, args){
      //обработчик: meth === 'method', args ~ [1,2,3]
  }
}).method(1,2,3); //не выдаст ошибки


В общем, не нашел чего-то очень полезного. Хотя я и не сильно углублялся.

Mахmахmахimus 15.02.2012 16:03

Цитата:

Сообщение от FINoM
Это метод объекта, который вызывается, когда пытаются вызвать несуществующий метод.

ты правда не видишь в этом ни чего полезного? По мне так вообще странно что это не стандартно, я думал почему то что такая ловушка есть уже.

FINoM 15.02.2012 16:18

Цитата:

Сообщение от Mахmахmахimus
ты правда не видишь в этом ни чего полезного? По мне так вообще странно что это не стандартно, я думал почему то что такая ловушка есть уже.

Нет, эта вещь крутая, я о прокси.

Kolyaj 15.02.2012 17:40

Цитата:

Сообщение от Mахmахmахimus
По мне так вообще странно что это не стандартно, я думал почему то что такая ловушка есть уже.

Это не так легко воткнуть в семантику JavaScript-а. В каких случаях должна вызываться ловушка? Когда у самого объекта нет искомого свойства? Или такого свойства нет во всей цепочке его прототипов? И почему именно так, а не иначе? У обоих вариантов есть и плюсы, и минусы.

Mахmахmахimus 15.02.2012 17:48

Цитата:

Сообщение от Kolyaj
В каких случаях должна вызываться ловушка? Когда у самого объекта нет искомого свойства? Или такого свойства нет во всей цепочке его прототипов?

Это уже пользователю решать, я же про прокси говорю, прокси использует ловушки.. Там можно смотреть обратились ли к свойству или нет и перехватывать это ловушкой. Но там вроде нельзя определить собираются ли вызывать это свойство как функцию.

Но если бы была такая ловушка(а что её нет я не уверен), можно сделать так же как и в случае с обычным доступом к свойству. Смотреть есть ли оно в нужном обьекте, если нет, то при желании можно сделать запрос к цепочке прототипов и посмотреть там. это я думаю не проблема.

Mахmахmахimus 16.02.2012 18:03

Эмуляция __noSuchMethod__

Используя Прокси возможно эмулировать хук __noSuchMethod__ в тех браузерах, которые его не поддерживают (но сейчас это не актуально).
function MyObject() {};
MyObject.prototype = Object.create(NoSuchMethodTrap);
MyObject.prototype.__noSuchMethod__ = function(methodName, args) {
  return 'Hello, '+ methodName;
};

new MyObject().foo() // returns 'Hello, foo'


Этот объект использует NoSuchMethodTrap-прокси в котором ловушка get заменяет оригинальный __noSuchMethod__.
var NoSuchMethodTrap = Proxy.create({
  get: function(rcvr, name) {
    if (name === '__noSuchMethod__') {
      throw new Error("receiver does not implement __noSuchMethod__ hook");
    } else {
      return function() {
        var args = Array.prototype.slice.call(arguments);
        return this.__noSuchMethod__(name, args);
      }
    }
  }
});


Часовой пояс GMT +3, время: 00:07.