先来一段代码
var Person = function () {};
var person1 = new Person();
new 过程一共包括4个步骤:
1、创建一个新对象
var person1 = new Object();
2、设置原型链,将空对象的原型proto指向构造函数的原型
person1.__proto__ = Person.prototype
3、将构造函数的作用域赋给新对象(将this指向这个新对象),执行构造函数代码(为给这个新对象添加属性)
让Person中的this指向person1,并执行Person的函数体。
var result = Person.call(person1)
4、返回新对象(return),判断Person的返回值类型。如果是值类型,返回person1,忽略返回值;如果是引用类型,就返回这个引用类型的对象。
return result instanceof Object ? result : person1;
默认情况下函数返回值为undefined,即没有显示定义返回值的话,但构造函数例外,new 构造函数在没有return的情况下默认返回新创建的对象。
但是,在有显示返回值的情况下,如果返回值为基本数据类型(string、number、null、undefined、Boolean),返回值仍然是新创建的对象。
只有在显示返回一个非基本数据类型(object)时,函数的返回值才为指定对象。这种情况下,this所引用的值也被丢弃了。