|
|
|
@ -24,12 +24,9 @@ JavaScript 使用对象模拟函数的的设计代替了一般编程语言中的
@@ -24,12 +24,9 @@ JavaScript 使用对象模拟函数的的设计代替了一般编程语言中的
|
|
|
|
|
但是对于用户使用 `function` 语法或者 Function 构造器创建的对象来说,\[\[call\]\] 和 \[\[construct\]\] 的行为却是相似的 |
|
|
|
|
|
|
|
|
|
\[\[construct\]\] 的执行过程实际上和 new 关键词的执行过程是一致的: |
|
|
|
|
1. 以 Object.prototype 为原型创建一个对象 |
|
|
|
|
2. 以新对象为 this,执行函数的 \[\[call\]\] |
|
|
|
|
3. 如果 \[\[call\]\] 的返回值是对象则返回该对象,否则返回第一步创建的对象 |
|
|
|
|
|
|
|
|
|
1. 创建一个空的简单JavaScript对象 (即 **{}**,以 Object.prototype 为原型) |
|
|
|
|
2. 为步骤1新创建的对象添加属性 **\_\_proto\_\_**,将该属性链接至构造函数的原型对象 |
|
|
|
|
3. 以新对象为 this,执行函数的 \[\[call\]\] |
|
|
|
|
4. 如果 \[\[call\]\] 的返回值是对象则返回该对象,否则返回第一步创建的对象 |
|
|
|
|
|
|
|
|
|
以上似乎也是出现闭包的原因。 |
|
|
|
|
以上也是出现闭包的背景原因,因为如果构造函数返回一个对象,那么步骤一创建的新对象就会变成一个除了构造函数之外完全无法访问的对象 |