相关疑难解决方法(0)

什么是"new.target"?

ECMAScript 2015规范提到关键字(或单词?)new.target正好3次 - 在14.2.3中 1次:

通常,Contains不会查看大多数函数表单但是,Contains用于检测ArrowFunction中的new.target,this和super用法.

14.2.16中两次:

ArrowFunction不为arguments,super,this或new.target定义本地绑定.对ArrowFunction中的参数,super,this或new.target的任何引用 都必须解析为词汇封闭环境中的绑定

MDN提到它,但非常模糊,页面不完整.

巴别塔似乎不支持它.尝试在函数(箭头或其他)中使用new.target时出现语法错误.

它是什么,它应该如何使用?

javascript ecmascript-6

25
推荐指数
2
解决办法
6139
查看次数

代理ES6类并维护原型链

我使用以下包装器代理方法:

  public static wrap(target) {
    function construct(constructor, args) {
      const c: any = function(this) {
        return constructor.apply(this, args);
      };

      c.prototype = constructor.prototype;
      return new c();
    }

    const f = (...args) => {
      const instance = construct(target, args);

      const descriptors = getMethodDescriptors(target, instance);

      return new Proxy<T>(
        instance,
        new SomeProxyHandler(descriptors)
      );
    };

    f.prototype = target.prototype;
    return f;
  }
Run Code Online (Sandbox Code Playgroud)

这在包装编译到ES5的类时运行良好但是现在我试图以ES6为目标我在constructor.apply(this, args)说:

TypeError: Class constructor OneOfMyClasses cannot be invoked without 'new'
Run Code Online (Sandbox Code Playgroud)

如何修复此代码,以便wrap代理任何JavaScript目标的类并维护正确的原型链?

javascript proxy ecmascript-6

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

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

我有一个复杂的类,需要将某些参数传递给构造函数。但是,我向客户公开了一个简化的 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
查看次数

标签 统计

javascript ×3

ecmascript-6 ×2

es6-class ×1

es6-proxy ×1

proxy ×1