new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:
1. 创建一个空的简单 JavaScript 对象(即 {});
2. 链接该对象(即设置该对象的构造函数)到另一个对象;
3. 将步骤 1 新创建的对象作为 this 的上下文;
4. 如果该函数没有返回对象,则返回 this。
window.name = "iii"
function Person(){this.name = 3}
Person.prototype.say = function(){console.log(this.name)
}
var p1 = new Person();
p1.say() //3
function _new(P){let o = {}; //1. 新建对象
let arg = Array.prototype.slice.call(arguments,1);
o.__proto__ = P.prototype; //2. 链接对象
// P.prototype.constructor = P;
P.apply(o,arg);//3. 设置 this 指向 obj(原来指向 window)// 执行一次构造函数
return o;//4. 返回对象
}
var p2 = _new(Person)
p2.say() //3
console.log(p2 instanceof Person) //true
console.log(p2.construtor === p1.construtor) //true
当代码 new Foo(…) 执行时,会发生以下事情:
一个继承自 Foo.prototype 的新对象被创建。
使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤 1 创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)