一烫幕、基本寫法
a.
class Example {
constructor(a, b) {
this.a = a;
this.b = b;
}
say () {
return 'a: ' + this.a + ', b: ' + this.b;
}
}
b.
typeof Example // "function"
Example === Example.prototype.constructor // true
c.
let e = new Example ();
e.constructor === Example.prototype.constructor // true
d.
Object.keys(Example.prototype) // []
Object.getOwnPropertyNames(Point.prototype) // ["constructor","say"]
e.
const MyClass = new class {};
let inst = new class{}();
a.上面定義了一個類,包含著一個構(gòu)造函數(shù)和一個say方法具篇。構(gòu)造函數(shù)內(nèi)的this指向?qū)嵗龑ο笪诚迹以摵瘮?shù)默認返回this;如果沒有顯式定義定義構(gòu)造函數(shù)驱显,在通過 new
生成實例對象時會默認添加一個空的 constructor
方法诗芜;
b. 類的類型是函數(shù),且指向自身的構(gòu)造函數(shù)埃疫;
c. 類的所有方法都定義在類的 prototype
屬性上面伏恐;如果要修改原型對象,不建議用proto方法栓霜〈滂耄可以使用 Object.getPrototypeOf(obj)
和 Object.setPrototypeOf(object, prototype)
來獲取及修改;
d. 類的內(nèi)部所有定義的方法胳蛮,都是不可枚舉的销凑;如有需要,可以用Object.getOwnPropertyNames
和 Reflect.ownKeys
方法進行遍歷仅炊。前者包含對象自身的所有屬性(不含 Symbol 屬性斗幼,但是包括不可枚舉屬性)的鍵名,后者包含對象自身的所有鍵名抚垄,不管鍵名是 Symbol 或字符串蜕窿,也不管是否可枚舉谋逻;
e. 類可以用表達式來定義;利用表達式可以定義一個立即執(zhí)行的類桐经,可以通過類后面的括號傳遞參數(shù)給該類的構(gòu)造函數(shù)毁兆;
注意:
- es5中原型對象上的方法是可枚舉的;
- 類的屬性名可以使用表達式阴挣;
- 如果不用
new
命令去調(diào)用類气堕,會報錯;而es5中的構(gòu)造函數(shù)可以直接調(diào)用屯吊;es6為new
命令引入了new.target
屬性送巡,返回該命令作用的那個構(gòu)造函數(shù); - 類的構(gòu)造函數(shù)可以返回其他對象盒卸,這時生成的對象便不在是該類的實例對象骗爆;
- 類不存在變量提升;
二蔽介、屬性與方法
class MyName {
constructor() {...}
set name(value) {
console.log('setter: '+value);
}
get name() {
return 'getter';
}
static name() {
return 'Mary';
}
}
a.
let nameInst = new MyName();
nameInst.name // 'getter'
nameInst.name = 'Bob'; // setter: Bob
b.
MyName.name(); // 'Mary'
class HerName extends MyName {}
或
class HerName extends MyName {
static name() {
return super.name();
}
}
HerName.name(); // 'Mary'
a. 可以在類中定義某個屬性的存值與取值函數(shù)摘投;這兩個函數(shù)其實是設(shè)置在屬性的Descriptor對象上的;
b. 類的方法前加 static
關(guān)鍵字表明該方法是一個靜態(tài)方法虹蓄,不能被實例繼承犀呼;靜態(tài)方法內(nèi)的this指向該類;且靜態(tài)方法可以與非靜態(tài)方法重名薇组,也能被子類所繼承外臂;