Javascript ECMAScript 5标准中描述的“new”关键字是如何工作的

Javascript ECMAScript 5标准中描述的“new”关键字是如何工作的,javascript,Javascript,我想知道新操作符是如何工作的,而不仅仅是学习如何使用它。我查看了中的,发现算法描述了它是如何工作的,但对它的含义有点困惑 《新表现主义:新表现主义》这部作品被评为 如下: 设ref为计算NewExpression的结果。 让构造函数为GetValueref。 如果Typeconstructor不是对象,则引发TypeError异常。 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常。 返回对构造函数调用[[Construct]]内部方法的结果,不提供任何参数,即

我想知道新操作符是如何工作的,而不仅仅是学习如何使用它。我查看了中的,发现算法描述了它是如何工作的,但对它的含义有点困惑

《新表现主义:新表现主义》这部作品被评为 如下:

设ref为计算NewExpression的结果。 让构造函数为GetValueref。 如果Typeconstructor不是对象,则引发TypeError异常。 如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常。 返回对构造函数调用[[Construct]]内部方法的结果,不提供任何参数,即参数的空列表。 我试着用这个例子来理解上面的算法:

var f = function() {};    
var h = new f();
特别是我不理解第一步,因此无法遵循其他步骤

设ref为计算NewExpression的结果。 这是否意味着ref是f的值?但它还没有定义

三,。如果Typeconstructor不是对象,则引发TypeError异常

但是f的类型是函数,它会抛出TypeError异常吗

五,。返回对构造函数调用[[Construct]]内部方法的结果,不提供任何参数,即参数的空列表


[[Construct]]函数的内部属性,在构造函数上调用它有什么意义?

让我们一步一步地看一下

解决新窗口['foo'+1+'bar']->new window.foo1bar之类的问题 确定实际引用的对象:什么是窗口?全局对象的局部变量或属性? 这是显而易见的。 不是很明显,但重点是:每个函数都是构造函数,但不是每个构造函数都是函数。这一点确保只对构造函数调用new。 运行构造函数。请注意,该规范还为案例new foo提供了MemberExpression:new MemberExpression参数。。。
让我们一步一步地看一遍

解决新窗口['foo'+1+'bar']->new window.foo1bar之类的问题 确定实际引用的对象:什么是窗口?全局对象的局部变量或属性? 这是显而易见的。 不是很明显,但重点是:每个函数都是构造函数,但不是每个构造函数都是函数。这一点确保只对构造函数调用new。 运行构造函数。请注意,该规范还为案例new foo提供了MemberExpression:new MemberExpression参数。。。
首先,我们必须澄清什么是新表达式,尤其是新表达式。这可以在中找到。应用此规则的最常见情况是不向构造函数传递参数。即

var obj = new F;
其中F指一个函数。这是一条可以省略括号的规则

在您的示例中,var h=new f;,不过,您有括号,即您传递的参数列表为空,因此此算法不适用。f不是新的表达式

相反,此算法适用于:新的MemberExpression参数。它的评估方式几乎相同,算法也可以在中找到,就在您引用的算法之后

考虑到这一点,让我们一步一步地完成该算法:

一,。设ref为计算MemberExpression的结果

在您的示例中,MemberExpression是f,即它是一个变量。是一个特殊的对象。这并不重要,它到底是什么。只需知道它包含如何从变量中实际获取值的信息。 现在ref引用了那个引用

二,。让构造函数为GetValueref

这是实际检索的变量值,构造函数将引用f引用的函数

三,。让argList作为参数求值的结果,生成参数值的内部列表

在您的例子中,参数是,因此它是一个空列表

四,。如果Typeconstructor不是对象,则引发TypeError异常

重要的是要知道函数也是对象!因此,如果在新表达式中使用基元值,此步骤将抛出错误

五,。如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常

所有函数和可能的其他对象都实现一个内部[[Construct]]属性,该属性执行新对象的实际实例化。如果对象没有这样的属性,则不能将其用作构造函数。中定义了它对函数的工作方式

六,。返回对构造函数调用[[Construct]]内部方法的结果,并提供列表argList作为参数值

这是实际施工中发生的情况。[[Construct]]本身就是函数,在中定义。该方法与每个函数相同,负责创建一个新对象,调用该新对象上的函数并返回它或函数返回的任何内容

下面是一个JavaScript部分伪代码的示例:

[[Construct]] = function(F, argList) {
    // Create new object that in inherits from F.prototype or Object.prototype
    var proto = F.prototype;
    var obj = Object.create(typeof proto === 'object' ? proto : Object.prototype);

    // Call F with this set to obj and pass the argument list
    var result = F.apply(obj, argList);

    // If result is not an object, return the generated object
    return typeof result === 'object' ? result : obj;
};

首先,我们必须澄清什么是新表达式,尤其是新表达式。这可以在中找到。应用此规则的最常见情况是不向构造函数传递参数。即

var obj = new F;
其中F指一个函数。这是一条可以省略括号的规则

在您的示例中,var h=new f;,不过,您有括号,即您传递的参数列表为空,因此此算法不适用。f不是新的表达式

相反,此算法适用于:新的MemberExpression参数。它的评估方式几乎相同,算法也可以在中找到,就在您引用的算法之后

考虑到这一点,让我们一步一步地完成该算法:

一,。设ref为计算MemberExpression的结果

在您的示例中,MemberExpression是f,即它是一个变量。是一个特殊的对象。这并不重要,它到底是什么。只需知道它包含如何从变量中实际获取值的信息。 现在ref引用了那个引用

二,。让构造函数为GetValueref

这是实际检索的变量值,构造函数将引用f引用的函数

三,。让argList作为参数求值的结果,生成参数值的内部列表

在您的例子中,参数是,因此它是一个空列表

四,。如果Typeconstructor不是对象,则引发TypeError异常

重要的是要知道函数也是对象!因此,如果在新表达式中使用基元值,此步骤将抛出错误

五,。如果构造函数未实现[[Construct]]内部方法,则引发TypeError异常

所有函数和可能的其他对象都实现一个内部[[Construct]]属性,该属性执行新对象的实际实例化。如果对象没有这样的属性,则不能将其用作构造函数。中定义了它对函数的工作方式

六,。返回对构造函数调用[[Construct]]内部方法的结果,并提供列表argList作为参数值

这是实际施工中发生的情况。[[Construct]]本身就是函数,在中定义。该方法与每个函数相同,负责创建一个新对象,调用该新对象上的函数并返回它或函数返回的任何内容

下面是一个JavaScript部分伪代码的示例:

[[Construct]] = function(F, argList) {
    // Create new object that in inherits from F.prototype or Object.prototype
    var proto = F.prototype;
    var obj = Object.create(typeof proto === 'object' ? proto : Object.prototype);

    // Call F with this set to obj and pass the argument list
    var result = F.apply(obj, argList);

    // If result is not an object, return the generated object
    return typeof result === 'object' ? result : obj;
};
请注意,新的f;是新的表达式,而新的f;是新的MemberExpression参数,参数为空;是新的表达式,而新的f;是新的MemberExpression参数,参数为空。另请参阅