在js中,物件的建立方式有許多種,new objec、字面量、建構函式等等,在es6中提供了採用class關鍵字來建立物件的方式,這些林林種種的寫法各有優劣,但是追根究底都是採用new object的方式來建立的。object是js的內建物件,也是所有物件的起源,那麼為什麼new乙個object得到的就得到個物件呢?這裡使用乙個更複雜的例子來說明這個問題。
class caraddspeed(_speed)
}
上面通過es6提供的class關鍵字建立了乙個名為car的類,並且定義了屬於這個類的名字、速度和**的屬性,這個類還提供了加速的方法。在class關鍵字的作用範圍內,this指向這個類的原型,所以在其中定義的方法,是屬於原型物件的方法,例項化的物件都具有共同的方法。在constructor構造器函式中,this指向構造器,也就是建構函式,在構造器中定義的屬性屬於例項化物件自身的屬性。
let bmw = new car("bmw", 60, 200000);
**執行遇到new,首先通過object建立乙個空物件。
然後修改這個空物件的__proto__使其指向建構函式的prototype,那麼現在空物件的__proto__指向了addspeed()方法所在的地方,建立的空物件就能夠呼叫這個方法。
改變類的構造器函式中this的值,現在this的值是剛才建立的空物件。然後執行構造器函式中的**,傳遞的實參就是這個新建立物件的屬性。
構造器函式執行完成後,會預設例項化物件賦值符號後面的等式有乙個返回值,這個返回值就是這個物件整體,然後執行賦值運算,宣告的bmw就是乙個新的屬於car的物件。
由於在建立過程中先修改空物件的__proto__,然後再執行構造器函式,所以在constructor中呼叫class中定義的方法是能夠執行的。
如果在構造器函式中return了乙個值,那麼採用new建立物件,建構函式執行完成後返回的就不是整體物件,而是return的值。
物件例項化過程
1.首先分析一下記憶體空間 棧訪問速度比堆要快,僅次於直接位於cpu中的暫存器 2.物件例項化 1 首先,靜態 塊在載入時就執行了,所以肯定是最先執行的 2 對於非靜態 塊會在構造方法中的 塊之前載入 執行結果 static成員在載入位元組碼檔案到記憶體過程是會被優先執行,靜態成員變數會在方法區優先...
子類物件的例項化過程
源 class person public person string name,int age class student extends person public student string name,int age public student string name,int age,st...
物件例項化過程分析
下面通過乙個簡單經典的demo演示下 class fu public void show class ziextends fu public void show public class test 執行結果 zi.run.0zi cons run1.8zi.run.8例項化步驟 1.jvm會讀取指定...