gpt4 book ai didi

javascript - "new"关键字如何按照 ECMAScript 5 标准中的描述工作

转载 作者:行者123 更新时间:2023-11-30 08:51:41 26 4
gpt4 key购买 nike

我想知道 new 运算符是如何工作的,而不仅仅是学习如何使用它。我查看了 ECMAScript 5 standard并发现该算法描述了它是如何工作的,但对它的含义有点困惑。

The production NewExpression : new NewExpressionis evaluated as follows:

  1. Let ref be the result of evaluating NewExpression.
  2. Let constructor be GetValue(ref).
  3. If Type(constructor) is not Object, throw a TypeError exception.
  4. If constructor does not implement the [[Construct]] internal method, throw a TypeError exception.
  5. Return the result of calling the [[Construct]] internal method on constructor, providing no arguments (that is, an empty list of arguments).

我试着用这个例子来理解上面的算法:

var f = function() {};    
var h = new f();

特别是我不明白第一步,因此无法执行其他步骤。

  1. Let ref be the result of evaluating NewExpression.
var h = new f();
~~~ ~~~~
| \_________ NewExpression
new operator

这是否意味着 reff() 的值?但它是 undefined

3 . If Type(constructor) is not Object, throw a TypeError exception.

但是f的类型是函数,会不会抛出TypeError异常?

5 . Return the result of calling the [[Construct]] internal method on constructor, providing no arguments (that is, an empty list of arguments).

[[Construct]] 函数的内部属性,在constructor 上调用它是什么意思?

最佳答案

首先我们要弄清楚new NewExpression是什么特别是 NewExpression是。这可以在 Annex A 中找到.适用此规则的最常见情况是您不向构造函数传递参数。 IE。

var obj = new F;

哪里F指一个函数。所以这是允许您省略括号的规则。

在您的示例 ( var h = new f(); ) 中,您有括号,即您传递的是一个空参数列表,因此该算法不适用f() 不是 NewExpression .

相反,此算法适用:new MemberExpression Arguments .它的评估方式几乎相同,算法可以在 §11.2.2 中找到。同样,就在您引用的算法之后。

考虑到这一点,让我们逐步了解该算法:

1. Let ref be the result of evaluating MemberExpression.

在您的示例中,MemberExpression , 是 f ,即它是一个变量。 The result of the evaluation是一个特殊的Reference目的。 什么在这里并不重要。只知道它包含有关如何实际从变量中获取值的信息。
所以现在ref引用该引用。

2. Let constructor be GetValue(ref).

这是实际检索到的变量值 constructor将引用 f 的函数指的是。

3. Let argList be the result of evaluating Arguments, producing an internal list of argument values (11.2.4).

在你的例子中,Arguments()因此它是一个空列表。

4. If Type(constructor) is not Object, throw a TypeError exception.

重要的是要知道函数也是对象!因此,如果在 new 中使用了原始值,此步骤将抛出错误。表达。

5. If constructor does not implement the [[Construct]] internal method, throw a TypeError exception.

所有函数(以及可能的其他对象)都实现内部 [[Construct]]对新对象进行实际实例化的属性。如果对象没有这样的属性,则不能用作构造函数。 §13.2.2 中定义了函数的工作方式.

6. Return the result of calling the [[Construct]] internal method on constructor, providing the list argList as the argument values.

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

这是一个在 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;
};

关于javascript - "new"关键字如何按照 ECMAScript 5 标准中的描述工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com