new 和直接执行函数的区别,new 如何实现

this 指向不同

1
2
3
4
5
6
创建一个Test构造函数,打印this
function Test() {
console.log(this)
}
var test = new Test() // Test {}
var t = Test() // Window { ... }

对 return 的处理

1
如果一个构造函数return了一个引用类型的数据,那么使用new创建它的实例时,将会返回return的内容,当返回的值是基本类型时,将会正常创建实例

new 操作符都做了什么

1
2
var Fn = function () {};
var fn = new Fn();
  1. 创建一个空对象
1
var obj = new Object();
  1. 设置原型链(调用一个构造函数创建一个新实例后,该实例的内部将包含一个指针,只想构造函数的原型对象)
1
obj.__proto__ = Fn.prototype;
  1. 让 Fn 中的 this 指向 obj,并执行 Fn 的函数体(创建新对象之后,将构造函数的作用域赋值给新对象)
1
var result = Fn.call(obj);
  1. 确保 Fn 的函数体返回的是对象
1
2
3
4
5
if (typeof result == "object") {
fn = result;
} else {
fn = obj;
}