JavaScript代理设置器不会进行第二次代理调用

时间:2019-12-23 09:29:43

标签: javascript ecmascript-6 proxy

我有以下代码正在使用“类设置器代理”。在我的示例中,我正在跟踪特定变量以更新其他一些变量。我的安装员正在将所有更改的日志写入控制台。但是,如果我尝试从设置器本身修改变量,则修改变量gas,但不调用Proxy。是否设计避免循环?还是我错过了什么?

$categories = CarCarProperty::where('car_id',$arac->id)->pluck('car_property_category_id')->toArray();
      $properties = CarCarProperty::where('car_id',$arac->id)->wherein('car_property_category_id',$categories )->pluck('car_property_id')->toArray();
        $propertylist= [];
        $data= [];
        $data['category'] = [];
        $data['property'] = [];
        foreach($categories as $category ){

            $findcategory= CarPropertyCategory::where('id',$category)->first();

            $data['category'] = $findcategory->title;
            foreach($properties as $property){

               $findproperty = CarProperty::where('id',$property)->first();
                if($category->id == $findproperty->category->id){

                    $property= $findproperty ->title;
                    $data['properties'] = $property;

                }




            }

            $propertylist[] = $data;

        }




        $propertylist= collect($propertylist)->groupBy('category');

2 个答案:

答案 0 :(得分:1)

问题是您的陷阱仅运行obj[prop] = value,该陷阱在目标obj而非代理上设置了属性。相反,您应该使用Reflect.set method,它为set陷阱提供默认实现,并需要一个可选的receiver参数。此接收者是设置者将要评估的对象,您应该传递receiver argument of the set trap(它将引用您为newHero分配的resistance代理)。

class DarthVader {
  set resistance(val) {
    this._resistance= val
    this.darkSide = false
  }

  get resistance() { return this._R2D2 }

}

let newHero = new Proxy(new DarthVader, {
  set(target, prop, value, receiver) {
    console.log(`Setting ${prop} to ${value}`)
    return Reflect.set(target, prop, value, receiver)
    //     ^^^^^^^^^^^
    // obj[prop] = value
  }
});

newHero.resistance = 11
console.log(newHero.darkSide)

答案 1 :(得分:-1)

obj中的set指的是thisreturn new Proxy(this的含义,并且该对象不是是代理,但是darthVader实例本身-由darthVader构造函数创建的实例。因此,当您将属性分配给obj时,会将属性直接放在darthVader实例上,而不是放在代理实例(即newHero)上。因此,代理方法不会被调用。

如果您想递归调用代理,可以在从构造函数返回它之前定义它(例如,作为变量名proxy),然后在{{1 }}方法,但是在当前逻辑下,这会导致堆栈溢出,因为您将不断调用代理的setter:

proxy