class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
1 注意
類的所有方法都定義在類的prototype屬性上面
類的內(nèi)部所有定義的方法,都是不可枚舉的
定義“類”的方法的時候,前面不需要加上function這個關(guān)鍵字
類的方法之間不需要逗號分隔,加了會報錯
2 類的constructor方法:
1 當類沒有constructor方法時,會添加空的constructor方法
2 constructor默認返回this對象,與es5的構(gòu)造函數(shù)是一樣的
2.1 類的實例屬性
1 實例屬性可以寫在constructor中,也可以寫在最頂部
class foo {
bar = 'hello';
baz = 'world';
constructor() {
// ...
}
}
3 類的實例對象
生成類的實例時必須使用new關(guān)鍵字,且類不能自己調(diào)用;
4 類的原型對象
get和set關(guān)鍵字對屬性設(shè)置存取函數(shù),攔截該屬性的行為
class MyClass {
constructor() {
// ...
}
get prop() {
return 'getter';
}
set prop(value) {
console.log('setter: '+value);
}
}
let inst = new MyClass();
inst.prop = 123;
// setter: 123
inst.prop
// 'getter'
里面的方法默認綁定this為類的實例,可是如果單獨取出該方法,會丟失this指針,在react中就是如此。為了指向正確的this,可以使用箭頭函數(shù),bind方法和proxy代理
5.1 靜態(tài)方法
1 使用static關(guān)鍵字來描述類的靜態(tài)方法,在靜態(tài)方法中this指向類本身
2 子類可以繼承父類的靜態(tài)方法
3 在子類的方法中可以使用super來調(diào)用父類的靜態(tài)方法
5.2 靜態(tài)屬性
1 目前只有這種寫法,有個提案用static來代表靜態(tài)屬性
class Foo {
}
Foo.prop = 1;
Foo.prop // 1
5.3 私有屬性和私有方法
6 new.target屬性
1 該屬性一般用在構(gòu)造函數(shù)之中,返回new命令作用于的那個構(gòu)造函數(shù)
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
this.length = length;
this.width = width;
}
}
var obj = new Rectangle(3, 4); // 輸出 true
2 如果子類繼承父類時,new.target會返回子類
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
// ...
}
}
class Square extends Rectangle {
constructor(length) {
super(length, length);
}
}
var obj = new Square(3); // 輸出 false
7 類的繼承
使用extends關(guān)鍵字實現(xiàn)繼承
在繼承時,必須在使用this之前調(diào)用super方法
這是因為子類自己的this對象,必須先通過父類的構(gòu)造函數(shù)完成塑造,得到與父類同樣的實例屬性和方法, 然后再對其進行加工,加上子類自己的實例屬性和方法。如果不調(diào)用super方法,子類就得不到this對象。
7.1 super關(guān)鍵字
super當函數(shù)使用,只能在constructor中使用,此時代表父類的構(gòu)造函數(shù)
作為對象使用,在普通方法中指向父類的原型對象(拿不到父類實例對象的屬性),在靜態(tài)方法中,指向父類本身;
在子類普通方法 中通過super調(diào)用父類的方法時,方法內(nèi)部的this指向當前的子類實例 。在子類的靜態(tài)方法 中通過super調(diào)用父類的方法時,方法內(nèi)部的this指向當前的子類 ,而不是子類的實例。
由于this指向子類實例,所以如果通過super對某個屬性賦值,這時super就是this,賦值的屬性會變成子類實例的屬性。
class A {
constructor() {
this.x = 1;
}
}
class B extends A {
constructor() {
super();
this.x = 2;
super.x = 3;
console.log(super.x); // undefined
console.log(this.x); // 3
}
}
let b = new B();
最后編輯于 :2019.01.21 21:24:34
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。