标签: es6-proxy

JS Proxying HTML5画布上下文

我希望代理画布API,以便我可以测试抽象方法实际绘制到画布,但是我遇到问题,在代理后我得到一个错误:

'strokeStyle' setter called on an object that does not implement interface CanvasRenderingContext2D

此代码已简化但引发相同的错误:

/** !NB: This snippet will probably only run in Firefox */
var canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
canvas.style.backgroundColor = '#FF0000';

var ctx = canvas.getContext("2d");                          
var calls = [];

var handler = {
    get( target, property, receiver ) {

        if ( typeof ctx[property] === 'function' ){
            return function( ...args ){
                calls.push( { call: property, args: args } )
                return ctx[property]( ...args );
            }; …
Run Code Online (Sandbox Code Playgroud)

javascript html5 canvas ecmascript-6 es6-proxy

4
推荐指数
1
解决办法
503
查看次数

什么是身份保护膜代理的用例?

当我阅读有关ES6 Proxies的内容时,在我看过这个例子之前,它似乎很容易理解.

我很难过.我不明白他们使用的"湿/干"术语,我不知道什么时候我最终会遇到理想的选择,特别是因为我似乎无法找到它.

有人可以提供一个简短的解释,说明会发生什么样的情况?

javascript metaprogramming es6-proxy

4
推荐指数
1
解决办法
345
查看次数

在 javascript 中向代理添加(递归?)级别感知

我试图通过使用代理覆盖我的对象 getter 来打印出正在通过 getter 访问哪些节点。我试图基本上测试这个大对象的哪些部分没有被我的应用程序使用。我遇到的问题是能够添加一些方法来识别吸气剂父母是什么。这是我到目前为止所拥有的

function tracePropAccess(obj) {
  return new Proxy(obj, {
    get(target, propKey, receiver) {
      console.log("Get fired on ", propKey);
      return Reflect.get(target, propKey, receiver);
    }
  });
}

const testObj = {
  a: 1,
  b: {
    a: "no",
    b: "yes"
  },
  c: {
    a: "green",
    b: {
      a: "blue",
      b: "orange"
    }
  }
};

const tracer = tracePropAccess(testObj);

tracer.b.a;

tracer.a;

tracer.c.c.a;
Run Code Online (Sandbox Code Playgroud)

这对于向我展示道具钥匙非常有效 - 但它只是第一层的钥匙。我不确定如何使用此代理来处理此问题,因为此单个函数会覆盖所提供对象中的所有代理。有什么方法可以传递对象的父母/孩子吗?可能我也错误地处理了这个问题 - 所以我正在寻找任何意见。谢谢!

javascript ecmascript-6 es6-proxy

4
推荐指数
1
解决办法
925
查看次数

如何将ES6代理变回普通对象(PO​​JO)?

我正在使用一个将内容转换为ES6代理对象的库,而另一个我认为令人窒息的库是因为我将其中的一个传递给了我(我的代码是荒唐的,我知道),但我不知道如何取消代理对象。

但是我只是傻瓜。代理可以做任何事情!(在下面回答我的问题...)

javascript ecmascript-6 es6-proxy

4
推荐指数
5
解决办法
1069
查看次数

使用ES6代理捕获Object.hasOwnProperty

我想使用ES6代理来捕获以下常见代码:

for (let key in trapped) {
    if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
    let value = trapped[key];
    //various code
}
Run Code Online (Sandbox Code Playgroud)

但在查看了代理文档之后,我不知道该怎么做,主要是因为has陷阱陷阱是针对in运算符的,这似乎没有在上面的代码中使用,并且没有hasOwnProperty操作的陷阱.

javascript hasownproperty ecmascript-6 es6-proxy

2
推荐指数
1
解决办法
997
查看次数

ES6 代理返回值中的 handlet.set

在这段代码中

function report(message) {
  console.log(message);
}
function makeLoggable(target) {
  return new Proxy(target, {
    get(target, property) {
      report(`Reading ${property}`);
      const param = target;
      return param[property];
    },
    set(target, property, value) {
      report(`Writing value ${value} to ${property}`);
      const param = target;
      return param[property] = value;
    },
  });
}
let ninja = { name: 'Jack' };
ninja = makeLoggable(ninja);
console.assert(ninja.name === 'Jack', 'Our ninja Jack');
ninja.status = '';
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1) 为什么如果我将最后一行的属性状态值设置为 0 或 ""(空字符串),我会收到错误消息

未捕获的类型错误:代理上的“设置”:陷阱返回属性“状态”(...)的假

2)在规范中说我应该返回一个布尔值。但就我而言,在 set() 方法中,我不返回任何布尔值。在那种情况下,为什么这段代码有效?

javascript es6-proxy

2
推荐指数
1
解决办法
1479
查看次数

使用Proxy创建动态不可配置属性

我想使用Proxy创建动态不可配置属性.我试过这个:

const proxy = new Proxy({}, {
  getOwnPropertyDescriptor() {
    return {
      configurable: false,
      enumerable: false,
    };
  },
});

console.log(Reflect.getOwnPropertyDescriptor(proxy, 'test'));
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

TypeError: 'getOwnPropertyDescriptor' on proxy: trap reported non-configurability for property 'test' which is either non-existant or configurable in the proxy target

MDN说:

如果属性不作为目标对象的自身属性存在,或者它作为目标对象的可配置自己的属性存在,则不能将该属性报告为不可配置.

但它没有解释这背后的原因是什么.

这个错误有没有解决方法?

javascript ecmascript-6 es6-proxy

2
推荐指数
1
解决办法
367
查看次数

未捕获的类型错误:代理设置处理程序为属性“长度”返回 false

我开始测试以下代理模式,并在使用该.splice()方法时收到标题错误。

class A extends Array {
  constructor(...x) {
    super(...x)
    return new Proxy(this, {
      set(o,p,v) {
        console.log("set: ",o,p,v)
        return o[p] = v
      },
            
      get(o,p) {
        console.log("get: ",o,p)
        return o[p]
      },
    })
  }
}

const a = new A(1,2,3)

a.splice(1,0,"a")

Run Code Online (Sandbox Code Playgroud)

产生以下控制台输出:

get:  Array(3) [ 1, 2, 3 ] splice
get:  Array(3) [ 1, 2, 3 ] length
get:  Array(3) [ 1, 2, 3 ] constructor
set:  Array [] length 0

Uncaught TypeError: proxy set handler returned false for property '"length"' …
Run Code Online (Sandbox Code Playgroud)

javascript oop es6-proxy

2
推荐指数
1
解决办法
3859
查看次数

如何扩展包装在代理中的类

我有一个复杂的类,需要将某些参数传递给构造函数。但是,我向客户公开了一个简化的 API。

我的内部类看起来像这样:

class Foo {
  constructor(p, c) {
  }

  foo() {
  }
}
Run Code Online (Sandbox Code Playgroud)

p客户无法方便访问的内部参考在哪里。

支持公共 API

我希望允许客户创建此类的实例,但我不希望他们需要对私有p对象的引用。对于这个 API 的使用者来说,访问p会很费力并且会破坏现有的代码,所以我想用别名来隐藏它。

子类来拯救?几乎。

起初,我只是扩展了 Foo,隐藏了私有参数(通过提供访问它的代码),并通过公共 API 公开它:

class PublicFoo extends Foo {
  constructor(c) {
    // Use internal functions to get "p"
    var p;
    super(p, c);
  }
}
Run Code Online (Sandbox Code Playgroud)

这几乎奏效了,但我遇到了一个重大缺陷。在某些情况下,客户需要测试对象的类型。根据情况,Foo 可能是使用内部类在内部创建的,也可能是由客户使用公共 API 创建的。

如果公共 API 用于创建 Foo 的实例,则内部instaceof检查工作正常:publicFoo instanceof Foo返回true。但是,如果 API 使用内部类创建了 Foo 的实例,则公共instanceof检查将失败:internalFoo instanceof PublicFoo返回false。客户可以使用公共 API …

javascript es6-proxy es6-class

1
推荐指数
1
解决办法
290
查看次数

如何使 `foo[1] ==1; foo[1][2]==3; foo[1][2][3]==6` 在 JavaScript 中工作吗?

如何定义foo以使以下代码按预期正确工作(在 JavaScript 中)?

foo[1] + 1             // 2
foo[1][2] + 1          // 4
foo[10][20][30] + 1    // 61
foo[100][200][300] + 1 // 601
Run Code Online (Sandbox Code Playgroud)

这是我曾经遇到过的一个面试题。

javascript es6-proxy

-4
推荐指数
1
解决办法
63
查看次数