一、ES6中的類徹底能夠看做構造函數的另外一種寫法。javascript
class Point{ //.. } typeof Point //'function' Point === Point.prototype.constructor // true
類的數據類型就是函數,類自己指向構造函數java
class Point{ //.. constructor(){ } toString(){ } toValue(){ } } // 等同於 Point.prototype = { constructor(){}, toString(){}, toValue(){} }
Object.assign方法能夠很方便的一次向類添加多個方法。函數
Object.assign(Point.prototype,{
toString(){},
toValue(){}
})
類的內部定義的全部方法都是不可枚舉的this
二、constructorspa
constructor 方法是類的默認方法,經過new命令生成對象實例時自動調用該方法。一個類必須有constructor方法,若是沒有顯示定義,空的constructor會被添加。prototype
三、實例對象code
使用new對象
類的全部實例共享一個原型對象blog
var p1 = new Point(2,3); var p2 = new Point(3,3); p1.__proto__ = p2.__proto__
四、不存在變量提高繼承
class不存在變量提高
五、class 的繼承
class 之間能夠經過extends關鍵字實現繼承
class colorpoint extends point {}
super 關鍵字,指代父類的實例(即父類的this對象)
子類必須在constructor方法中調用super方法,不然新建實例時會報錯,由於子類沒有本身的this對象。
ES6的繼承機制徹底不一樣,實質上是先創造父類的實例對象this,而後再用子類的構造函數修改this
只有調用super以後,纔可使用this關鍵字
六、類的prototype屬性和__proto__屬性
在ES5中,每個對象都有__proto__屬性,指向對應的構造函數的prototype屬性。
ES5:
1.對象有屬性__proto__,指向該對象的構造函數的原型對象。
2.方法除了有屬性__proto__,還有屬性prototype,prototype指向該方法的原型對象。
class 做爲構造函數的語法糖,同時有prototype屬性和__proto__屬性
一、子類的__proto__屬性表示構造函數的繼承,老是指向父類。
二、子類prototype 屬性的__proto__屬性表示方法的繼承,老是指向父類的prototype屬性。
class B extends A { } B.__proto__ === A//true B.prototype.__proto__ === A.prototype // true
Object.setPrototypeOf(B.prototype, A.prototype);// B 的實例繼承 A 的實例
// 等同於 B.prototype.__proto__ = A.prototype;
// B 的實例繼承 A 的靜態屬性
Object.setPrototypeOf(B, A); // 等同於 B.__proto__ = A;
這兩條繼承鏈,能夠這樣理解:做爲一個對象,子類(B
)的原型(__proto__
屬性)是父類(A
);做爲一個構造函數,子類(B
)的原型對象(prototype
屬性)是父類的原型對象(prototype
屬性)的實例。
七、實例的__proto__屬性
子類實例的__proto__
屬性的__proto__
屬性,指向父類實例的__proto__
屬性。也就是說,子類的原型的原型,是父類的原型
var p1 = new Point(2, 3); var p2 = new ColorPoint(2, 3, 'red'); p2.__proto__ === p1.__proto__ // false p2.__proto__.__proto__ === p1.__proto__ // true
八、class 的靜態方法
若是在一個方法前加上static關鍵字,就表示該方法不會被實例繼承,而是直接經過類調用,稱爲靜態方法。
父類的靜態方法能夠被子類繼承