当代码 new foo(…) 执行时:来自:MDN
- 一个新对象被创建。它继承自foo.prototype.
- 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(), 只能用在不传递任何参数的情况。
- 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。12345678910111213function Myclass(){this.a=20;}var o=new Myclass();console.log(o.a); //20function Person(){this.a=20;return { a: 21};}var o=new Person();console.log(o.a); //21注意返回对象代替整个new出来的o
举一个栗子:123# 正常创建一个对象function Super() {};var s = new Super();
以上其实等价于3个步骤:12345# 3个步骤var s = {};s.__proto__ = Super.prototype;Super.call(s);# 注:1.2两步,其实就是Object.create(Super.prototype);
创建一个空对象{}
1var s = {};拷贝构造函数的prototype 给 实例对象的 proto
1s.__proto__ === Super.prototype初始化对象
12# 把s当做Super中的this,做初始化s的操作Super.call(s);
例如:12345678910111213# 例如function Super() { this.y = 1;}# 通过Super.call(s);# 其实就相当于Super(_this) { _this.y = 1;}Super(s);//明白this其实就是new出来那个对象了吧