开门见山,new 运算符的操作步骤
当代码 new
Foo
(...)
执行时,会发生以下事情:
- 一个继承自
Foo
.prototype
的新对象被创建。 - 使用指定的参数调用构造函数
Foo
,并将 this 绑定到新创建的对象。new Foo
等同于new
Foo
()
,也就是没有指定参数列表,Foo
不带任何参数调用的情况。 - 由构造函数返回的对象就是
new
表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤
简单模拟一下new 运算符
function myNew (func) {
const o = Object.create(func.prototype);
const k = func.call(o);
if ( typeof k === "object") return k;
else return o;
}
简单验证一下
function M () {
this.name = "cyl";
}
function F() {
this.name = "666";
return {};
}
function myNew (func) {
const o = Object.create(func.prototype);
const k = func.call(o);
if ( typeof k === "object") return k;
else return o;
}
const my = myNew(M);
const f = myNew(F);
console.log(my);
console.log(f);