1. 程式人生 > >class的基本操作方法

class的基本操作方法

JavaScript語言中,生成例項物件的傳統方法是通過建構函式

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);
 

基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓物件原型的寫法更加清晰、更像面向物件程式設計的語法而已。上面的程式碼用ES6的class改寫。

//定義類
class Point{
    constructor(x,y){
        this.x = x;
        this.y = y;
    }
    toString(){
        return '(' + this.x + ', ' + this.y + ')';
    }
}

  

 

上面程式碼定義了一個類,可以看到裡面有一個constructor方法,這就是構造方法,而this關鍵字則代表例項物件。也就是說ES5的建構函式point,對應ES6的point類的構造方法。
Point類除了構造方法,還定義了一個toString方法。注意,定義類的方法的時候,前面不需要加上function這個關鍵字,直接把函式定義放進去就可以了。另外,方法之間不需要逗號分割,加了會報錯。
ES6的類,完全可以看作建構函式的另一種寫法。

class Point{
    //...
}
typeof Point//function
Point === Point.prototype.constructor//true;

  上面程式碼表明,類的資料型別就是函式,類本身就指向建構函式。

使用的時候,也就是直接對類使用new命令,跟建構函式的用法完全一致。

class Bar{
    doStuff(){
        console.log('stuff');
    }
}
var b = new Bar();
b.doStuff();

  

 

建構函式的prototype屬性,在ES6的類上面繼續存在。事實上,類的所有方法都定義在類的prototype屬性上面。

class Point{
    constructor(){}
    toString(){}
    toValue(){}
}
//等同於
Point.prototype = {
    constructor(){},
    toString(){},
    toValue(){},
}
 

在類的例項上面呼叫方法,其實就是呼叫原型上的方法。

class B{}
let b = new B{};
b.constructor === B.prototype.constructor;
 

上面程式碼中,b是B類的例項,它的constructor方法就是B類原型的constructor方法。
由於類的方法都定義在prototype物件上面,所以類的新方法可以新增在prototype物件上面。Object.assign方法可以很方便地一次向類新增多個方法。

class Point{

constructor(){}

}
Object.assign(Point.prototype,{

 
toString(){},
toValue(){} 

})

prototype物件的constructor屬性,直接指向類的本身,這與ES5的行為是一致的。

Point.prototype.constructor === Point//true.

另外,類的內部所有定義的方法,都是不可列舉的。

class Point{
    constructor(x,y){}
    toString(){}
}
Object.keys(Point.prototype);
Object.getOwnPropertyName(Point.prototype);

  

 

上面程式碼中,toString方法是Point類內部定義的方法,它是不可列舉的。這一點與ES5的行為不一致。

 
var Point = function(x,y){}
Point.prototype.toString=function(){}
Object.keys(Point.prototype);
//["toString"]
Obejct.getOwnPtopertyName(Point.prototype)
//["constructor","toString"]

上面程式碼採用ES5的寫法,toString方法就是可列舉的。
類的屬性名,可以採用表示式。

 
let methodName = 'getArea';
class Square{
    constructor(length){}
    [methodName](){}
}

Square類的方法名getArea,是從表示式得到的。

原文地址:https://segmentfault.com/a/1190000017212581