奇怪的鬼属性被发送到代理获取方法

时间:2017-09-30 00:43:18

标签: javascript node.js chai es6-proxy

这是导致错误的代码:

console.log(objectWithProxyProperty);

我正在处理的错误是,

TypeError: Cannot read property 'apply' of undefined

Error: The assertion library used does not have a 'inspect' property or method.

取决于我使用的检查,这在下面的代码中说明。清楚的是,检查'属性被发送到get方法,但是'检查'不是符号而是检查'也无法使用prop in chaiAssert阅读。

objectWithProxyProperty看起来像:

  const objectWithProxyProperty = {};

  const assrt = <Partial<AssertStatic>>  function () {
    try {
      return chaiAssert.apply(chaiAssert, arguments);
    }
    catch (e) {
      return handleError(e);
    }
  };

  // the assert property on objectWithProxyProperty is a Proxy 
  objectWithProxyProperty.assert = new Proxy(assrt, {
    get: function (target, prop) {

      if (typeof prop === 'symbol') {
        return Reflect.get(...arguments);
      }

      if (!(prop in chaiAssert)) {
        return handleError(
          // new Error(`The assertion library used does not have property or method.`)
          new Error(`The assertion library used does not have a '${prop}' property or method.`)
        );
      }

      return function () {
        try {
          return chaiAssert[prop].apply(chaiAssert, arguments);
        }
        catch (e) {
          return handleError(e);
        }
      }
    }
  });

似乎正在发生的事情是,当我使用名为&#34; assert&#34;的代理属性记录此对象时,代理本身会收到get方法的奇怪属性。

具体来说,这些属性被称为“检查”。和&#39;构造函数&#39;,它们似乎不是符号。

所以我必须要解决问题&#34;是这样添加一个支票:

   const objectWithProxyProperty = {};

  const assrt = <Partial<AssertStatic>>  function () {
    try {
      return chaiAssert.apply(chaiAssert, arguments);
    }
    catch (e) {
      return handleError(e);
    }
  };

  let badProps =  {
     inspect: true,
     constructor: true
  };

  objectWithProxyProperty.assert = new Proxy(assrt, {
    get: function (target, prop) {

      if (typeof prop === 'symbol') {
        return Reflect.get(...arguments);
      }

      if (badProps[String(prop)]) {  // ! added this !
        return Reflect.get(...arguments);
      }

      if (!(prop in chaiAssert)) {
        return handleError(
          // new Error(`The assertion library used does not have property or method.`)
          new Error(`The assertion library used does not have a '${prop}' property or method.`)
        );
      }

      return function () {
        try {
          return chaiAssert[prop].apply(chaiAssert, arguments);
        }
        catch (e) {
          return handleError(e);
        }
      }
    }
  });

chaiAssert上不存在的这些属性是什么,但不是符号?

到目前为止,这些幽灵属性一直在检查&#39;和#&#39;构造函数&#39;,但我问这个问题的原因是因为我需要找出可能存在的其他内容,以便我可以提前处理它们!

0 个答案:

没有答案