js與es6對比
1.js中沒有類(class)這個概念,通過構(gòu)造函數(shù)的方式實例化對象。
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function() {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
2.es6中同窘,引入類這個概念。
- constructor方法晨缴,就是構(gòu)造方法。(對應(yīng)上面js代碼中的構(gòu)造函數(shù)Point)峡捡。
- this指向?qū)嵗瘜ο蟆?/li>
- toString是類原型對象上的方法击碗。
- 類不存在變量提升筑悴。
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
//注意定義方法的時候,這里不用function關(guān)鍵字哦
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
實例化的時候延都,也是使用new
雷猪。跟構(gòu)造函數(shù)的用法一樣。
var p = new Point(1, 2);
類的方法
1.類所有的方法都是定義在原型對象prototype上的晰房,包括constructor也是類原型對象上的方法求摇。
class Point {
constructor() {
// ...
}
toValue() {
// ...
}
}
// 等同于
Point.prototype = {
constructor() {},
toValue() {},
};
2.在類的實例上面調(diào)用方法,其實就是調(diào)用原型上的方法殊者。
class B {}
let b = new B();
//實例化對象的constructor 是在__proto__的与境,不過原型鏈中,
//在自身上找不到的方法或者屬性時猖吴,會原型上找摔刁。
//即b.constructor==b.__proto__.constructor
b.constructor === B.prototype.constructor // true
3.類的內(nèi)部所有定義的方法,都是不可枚舉的海蔽。
4.屬性可以使用表達(dá)式共屈,例如下面的類的方法名就叫做“sayHello”
let methodName = 'sayHello';
class Square {
constructor() {
}
[methodName]() {
// ...
}
}
constructor 方法
1.constructor
方法是類的默認(rèn)方法,通過new
命令生成對象實例時党窜,自動調(diào)用該方法拗引。一個類必須有constructor
方法,如果沒有顯式定義幌衣,一個空的constructor
方法會被默認(rèn)添加矾削。
class Point {
}
// 等同于
class Point {
constructor() {}
}
2.constructor
方法,直接指向“類”的本身。(與es5中一致)
console.log(Point===Point.prototype.constructor) //true
類的實例
1.通過new來實例化對象豁护,不加會報錯哼凯。
// 報錯
var point = Point(2, 3);
// 正確
var point = new Point(2, 3);
2.實例化的時候,在類的constructor中通過this定義的屬性楚里,是實例對象自身的方法断部。而在類中定義的方法(例如上面的toString方法),則會掛在實例對象原型__proto__
上班缎。
get和set
get取值函數(shù)蝴光,set存值函數(shù)。(一般用不到吝梅,懶得寫虱疏,知道有這么回事得了~~)
靜態(tài)方法
在方法上加static
關(guān)鍵字惹骂,就是“靜態(tài)方法”苏携。
- 可以直接通過類調(diào)用。
- 靜態(tài)方法中的this指向的是類对粪,而不是實例右冻,所以不會被實例繼承装蓬。
class Foo {
static classMethod() { //靜態(tài)方法
return 'hello';
}
}
Foo.classMethod() // 'hello'
- 父類的靜態(tài)方法,可以被子類繼承纱扭。
- 靜態(tài)方法也是可以從super對象上調(diào)用的牍帚。
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {
static classMethod() {
return super.classMethod();
}
}
Bar.classMethod() // "hello"
實例屬性的新寫法
實例屬性一般在constructor的通過this定義,也可以定義在類的最頂層乳蛾。
class Par{
bb="hello"; //實例的屬性可以在頂層定義暗赶,不用加this
constructor (){
this.aa=1;
}
}
var p=new Par();
console.log(p.bb) // hello
靜態(tài)屬性
靜態(tài)屬性就是類自身的屬性。
class Par{
constructor (){
//....
}
}
Par.aa="haha"; //aa是靜態(tài)屬性
console.log(Par.aa) //"haha"
目前肃叶,只有這種寫法可行蹂随,因為 ES6 明確規(guī)定,Class 內(nèi)部只有靜態(tài)方法因惭,沒有靜態(tài)屬性≡浪現(xiàn)在有一個提案提供了類的靜態(tài)屬性,寫法是在實例屬性的前面蹦魔,加上static
關(guān)鍵字激率。
class Par{
// 新寫法
static aa="haha";
}