当代码 new Foo(...)
执行时,会发生以下事情:
-
一个继承自
Foo.prototype
的新对象{}被创建。 -
使用指定的参数调用构造函数
Foo
,并将this
绑定到新创建的对象。new Foo
等同于new Foo()
,也就是没有指定参数列表,Foo
不带任何参数调用的情况。 -
由构造函数返回的对象就是
new
表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)

用代码来看看
//讲解new的工作原理
var new2 = function(func) {//参数:指定构造函数
var o = Object.create(func.prototype);//第一步:生成一个新的对象,新对象要指定构造函数原型对象
var k = func.call(o);//第二步:要执行构造函数,用call转移上下文
if(typeof k === 'object') {//第三步:判断执行的结果是不是对象类型,若是就返回新创建的对象k,若不是就返回刚创建的对象o
return k
} else {
return o
}
}
var M = function(name){ this.name = name;}
我们验证一下:

网友评论