在JS中,对象的建立方式有许多种,new Objec、字面量、构造函数等等,在ES6中提供了采用class关键字来建立对象的方式,这些林林种种的写法各有优劣,可是追根究底都是采用new Object的方式来建立的。Object是JS的内置对象,也是全部对象的起源,那么为何new一个Object获得的就获得个对象呢?这里使用一个更复杂的例子来讲明这个问题。函数
class Car { constructor(name, speed, price) { this.name = name; this.speed = speed; this.price = price; } addSpeed(_speed) { return this.speed + _speed; } }
上面经过ES6提供的class关键字建立了一个名为Car的类,而且定义了属于这个类的名字、速度和价格的属性,这个类还提供了加速的方法。在class关键字的做用范围内,this指向这个类的原型,因此在其中定义的方法,是属于原型对象的方法,实例化的对象都具备共同的方法。在constructor构造器函数中,this指向构造器,也就是构造函数,在构造器中定义的属性属于实例化对象自身的属性。this
let bmw = new Car("bmw", 60, 200000);
代码执行遇到new,首先经过Object建立一个空对象。spa
而后修改这个空对象的__proto__使其指向构造函数的prototype,那么如今空对象的__proto__指向了addSpeed()方法所在的地方,建立的空对象就可以调用这个方法。prototype
改变类的构造器函数中this的值,如今this的值是刚才建立的空对象。而后执行构造器函数中的代码,传递的实参就是这个新建立对象的属性。code
构造器函数运行完成后,会默认实例化对象赋值符号后面的等式有一个返回值,这个返回值就是这个对象总体,而后执行赋值运算,声明的bmw就是一个新的属于Car的对象。对象
因为在建立过程当中先修改空对象的__proto__,而后再执行构造器函数,因此在constructor中调用class中定义的方法是可以执行的。blog
若是在构造器函数中return了一个值,那么采用new建立对象,构造函数执行完成后返回的就不是总体对象,而是return的值。原型