2016-06-24 3 views
3

Я хочу быть в состоянии сделать это:Chaining JavaScript объект (ES6) Proxy

x.where('age').gt(20); 

x.__calls // [['age', []], ['gt', [20]]] 

where и gt только примеры. Я не знаю, какие функции будут называться, они могут быть чем угодно, и они ничего не делают кроме заполнения массива __calls.

До сих пор у меня есть следующий код, который использует ES6 в Proxy объект

var x = new Proxy({ 
    __calls: [] 
}, { 
    get: function (target, name) { 
     if (name in target) { 
      return target[name]; 
     } else { 
      return() => { 
       target.__calls.push([name, Array.prototype.slice.call(arguments)]); 
       return x; 
      } 
     } 
    } 
}); 

Если удалить return x линию, я могу сделать x.where('age'); x.gt(20), чтобы получить правильный __calls. Тем не менее, с return x, он переходит в бесконечную рекурсию по какой-то причине ...

+0

@world больше мангуст названными-SCOPES беды – gberger

+1

Для будущих искателей, я думаю, что я придумал решение подобной проблемы здесь: http://stackoverflow.com/вопросы/41886355/захватывая-все-цепочечную-метода-и-добытчики-использование-а-прокси-для-ленивого-исполнения – JoeRocc

ответ

2

Я добавил console.log(name), чтобы выяснить, что вызывает были ответственны за бесконечную рекурсию, и оказывается, что это был inspect и constructor. Так что я просто черный список их :)

var x = new Proxy({ 
    __calls: [] 
}, { 
    get: function (target, name) { 
     if (name in target || name === 'inspect' || name === 'constructor') { 
      return target[name]; 
     } else { 
      return function() { 
       target.__calls.push([name, Array.prototype.slice.call(arguments)]); 
       return x; 
      } 
     } 
    } 
}); 
Смежные вопросы