new做了啥?

当代码 new foo(…) 执行时:来自:MDN

  1. 一个新对象被创建。它继承自foo.prototype.
  2. 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(), 只能用在不传递任何参数的情况。
  3. 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function Myclass(){
    this.a=20;
    }
    var o=new Myclass();
    console.log(o.a); //20
    function Person(){
    this.a=20;
    return { a: 21};
    }
    var o=new Person();
    console.log(o.a); //21注意返回对象代替整个new出来的o

举一个栗子:

1
2
3
# 正常创建一个对象
function Super() {};
var s = new Super();

以上其实等价于3个步骤:

1
2
3
4
5
# 3个步骤
var s = {};
s.__proto__ = Super.prototype;
Super.call(s);
# 注:1.2两步,其实就是Object.create(Super.prototype);

  1. 创建一个空对象{}

    1
    var s = {};
  2. 拷贝构造函数的prototype 给 实例对象的 proto

    1
    s.__proto__ === Super.prototype
  3. 初始化对象

    1
    2
    # 把s当做Super中的this,做初始化s的操作
    Super.call(s);

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 例如
function Super() {
this.y = 1;
}
# 通过
Super.call(s);
# 其实就相当于
Super(_this) {
_this.y = 1;
}
Super(s);//明白this其实就是new出来那个对象了吧

文章目录
|