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时出现语法错误.
它是什么,它应该如何使用?
我使用以下包装器代理方法:
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目标的类并维护正确的原型链?
我有一个复杂的类,需要将某些参数传递给构造函数。但是,我向客户公开了一个简化的 API。
我的内部类看起来像这样:
class Foo {
constructor(p, c) {
}
foo() {
}
}
Run Code Online (Sandbox Code Playgroud)
p客户无法方便访问的内部参考在哪里。
我希望允许客户创建此类的实例,但我不希望他们需要对私有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 …