在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的值。原型