- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
是否可以通过更改“this”上下文(调用、应用或其他)在另一个实例上使用 es6 构造函数指令?这可以使用 es5“类”。这是我的意思的一个小例子:
function ES5() {
this.foo = 'foo';
}
class ES6 {
constructor() {
this.bar = 'bar';
}
}
var a = new ES6();
ES5.call(a);
console.log(a.foo + a.bar); //foobar
var b = new ES5();
//Reflect.construct(ES6); ??
ES6.call(b); //TypeError: Class constructor ES6 cannot be invoked without 'new'
console.log(b.foo + b.bar); //how to get foobar here too?
最佳答案
正如评论和您自己所指出的,尝试使用自定义 this
调用类构造函数如果有任何解决方法,上下文真的不是你想要尝试的东西。这是故意变硬的!
如果由于某些原因这是不可避免的,足以证明棘手的解决方法是合理的,您可以在下面找到两个部分解决方案。它们都以自己的方式不完美 - 根据您的具体情况,其中之一可能仍然适合您的需求。
解决方法 1
虽然无法设置 this
直接在构造函数调用中,可以设置this
的原型(prototype)到您选择的对象 .
为此,您可以使用 Reflect.construct()
调用内部[[Construct]]
自定义方法new.target
值(value)。 this
然后将初始化为继承自 new.target.prototype
的对象.
以您的示例为基础:
function ES5() {
this.foo = 'foo';
}
class ES6 {
constructor() {
this.bar = 'bar';
}
}
let b = new ES5();
function TemporaryHelperConstructor() {}
TemporaryHelperConstructor.prototype = b;
b = Reflect.construct( ES6, [], TemporaryHelperConstructor ); // The third argument corresponds to the value of new.target
console.log( b.foo + b.bar ); // foobar !
Reflect.construct()
和内部
[[Construct]]
方法的确切工作原理在规范的
26.1.2 和
9.2.2 部分中进行了描述)
this
调用绑定(bind)到b
, 它被称为 this
绑定(bind)到直接继承自 b
的空对象.如果您或类构造函数依赖于 Object.getOwnPropertyNames()
之类的方法,这可能会导致问题。 , Object.getPrototypeOf()
等[[Call]]
类构造函数的方法而不会导致
TypeError
,
可以提取附加到类构造函数的代码块并从中创建一个普通函数,然后您可以使用自定义 this
调用它捆绑。
Function.prototype.toString()
方法将类构造函数的代码块提取为字符串。
Function()
然后构造函数可以从这个字符串中创建一个普通函数,您可以使用自定义
this
调用它通过
Function.prototype.apply()
绑定(bind).
function ES5() {
this.foo = 'foo';
}
class ES6 {
constructor() {
this.bar = 'bar';
}
}
const b = new ES5();
const constructorBody = ES6.toString().match( /(?<=constructor\(\) ){[^}]*}/ )[0]
const ordinaryFunction = Function( constructorBody )
ordinaryFunction.apply( b ); // No TypeError
console.log( b.foo + b.bar ); // foobar !
Function.prototype.toString()
的足够一致的输出,以使这种方法跨实现工作。)
new.target
将设置为 undefined
在执行普通函数时(与 [[Call]]
调用一样),如果类构造函数使用它可能会导致问题。 Function()
创建的新函数( MDN ),这可能会导致 ReferenceErrors
如果类构造函数依赖它们。 SyntaxError
如果使用 super()
应用于派生类,这在普通函数中是无效的语法。 关于javascript - 如何在不同的上下文中使用 es6 构造函数指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54622443/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!