|
|
@ -14,7 +14,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
固有对象构造器创建的对象多数使用了私有字段,这些字段使得原型继承方法无法正常工作,所以我们可以认为所有这些原生对象都是为了特定能力或者性能而设计出来的 “特权对象”。 |
|
|
|
固有对象构造器创建的对象多数使用了私有字段,这些字段使得原型继承方法无法正常工作,所以我们可以认为所有这些原生对象都是为了特定能力或者性能而设计出来的 “特权对象”。 |
|
|
|
|
|
|
|
|
|
|
|
函数对象的定义是:具有 \[\[call\]\] 私有字段的对象,该必须是一个引擎中定义的函数,需要接受 this 值和调用参 数,并且会产生域的切换。 |
|
|
|
函数对象的定义是:具有 \[\[call\]\] 私有字段的对象,该必须是一个引擎中定义的函数,需要接受 this 值和调用参数,并且会产生域的切换。 |
|
|
|
构造器对象的定义是:具有 \[\[construct\]\] 私有字段的对象。 |
|
|
|
构造器对象的定义是:具有 \[\[construct\]\] 私有字段的对象。 |
|
|
|
|
|
|
|
|
|
|
|
JavaScript 使用对象模拟函数的的设计代替了一般编程语言中的函数,它们可以像其他语言的函数一样被调用、传参,只需要实现了上面函数对象的定义要求,就能被 JavaScript 函数调用语法支持。 |
|
|
|
JavaScript 使用对象模拟函数的的设计代替了一般编程语言中的函数,它们可以像其他语言的函数一样被调用、传参,只需要实现了上面函数对象的定义要求,就能被 JavaScript 函数调用语法支持。 |
|
|
@ -24,12 +24,9 @@ JavaScript 使用对象模拟函数的的设计代替了一般编程语言中的 |
|
|
|
但是对于用户使用 `function` 语法或者 Function 构造器创建的对象来说,\[\[call\]\] 和 \[\[construct\]\] 的行为却是相似的 |
|
|
|
但是对于用户使用 `function` 语法或者 Function 构造器创建的对象来说,\[\[call\]\] 和 \[\[construct\]\] 的行为却是相似的 |
|
|
|
|
|
|
|
|
|
|
|
\[\[construct\]\] 的执行过程实际上和 new 关键词的执行过程是一致的: |
|
|
|
\[\[construct\]\] 的执行过程实际上和 new 关键词的执行过程是一致的: |
|
|
|
1. 以 Object.prototype 为原型创建一个对象 |
|
|
|
|
|
|
|
2. 以新对象为 this,执行函数的 \[\[call\]\] |
|
|
|
|
|
|
|
3. 如果 \[\[call\]\] 的返回值是对象则返回该对象,否则返回第一步创建的对象 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 创建一个空的简单JavaScript对象 (即 **{}**,以 Object.prototype 为原型) |
|
|
|
1. 创建一个空的简单JavaScript对象 (即 **{}**,以 Object.prototype 为原型) |
|
|
|
2. 为步骤1新创建的对象添加属性 **\_\_proto\_\_**,将该属性链接至构造函数的原型对象 |
|
|
|
2. 为步骤1新创建的对象添加属性 **\_\_proto\_\_**,将该属性链接至构造函数的原型对象 |
|
|
|
3. 以新对象为 this,执行函数的 \[\[call\]\] |
|
|
|
3. 以新对象为 this,执行函数的 \[\[call\]\] |
|
|
|
|
|
|
|
4. 如果 \[\[call\]\] 的返回值是对象则返回该对象,否则返回第一步创建的对象 |
|
|
|
|
|
|
|
|
|
|
|
以上似乎也是出现闭包的原因。 |
|
|
|
以上也是出现闭包的背景原因,因为如果构造函数返回一个对象,那么步骤一创建的新对象就会变成一个除了构造函数之外完全无法访问的对象 |