this與class(原型)

專注的阿熊發表於2020-12-01

class :類,是物件的模板。(或者叫:原型) this :當前物件。 以上定義,與 java 中的概念是相同的。 但是,由於 javascript 語言自身的特點,關於 class this ,還需要做進一步說明。

注意:在javascript 中,在定義類完畢之後,還可以再新增屬性和方法。

屬性與方法新增到this

class  Point {

    constructor() { }}let p = new Point();

p.username = 'zhangsan';

console.log(p.username);    //zhangsan

上面程式碼中,Point 類定義之後,給物件 p 又新增了一個 username 屬性。跟單網這是完全可以的。 但是要注意:此種方式,僅僅是給物件 p 新增一個屬性,而不是給類新增一個屬性。 或者說: 此種方式,僅僅是給物件 p this 新增一個屬性,而不是給類新增一個屬性。

class Point {

    constructor() { }}let p1 = new Point();

p1.username = 'zhangsan';

console.log(p1.username);   //zhangsan

let p2 = new Point();

console.log(p2.username);   //undefined

上面例子中,只給物件p1 新增了 username 屬性,但沒有給類新增屬性。 所以, p2 物件中並沒有 username 屬性。

屬性與方法新增到類上

class Point {

    constructor() { }}

Point.prototype.username = 'zhangsan';

let p1 = new Point();

console.log(p1.username);   //zhangsan

let p2 = new Point();

console.log(p2.username);   //zhangsan

上面程式碼中,使用 Point.prototype 方式,給類新增屬性。 這樣,類的所有物件( p1 p2 )就都有 username 屬性了。

javascript 中,每一個類都有一個 prototype ,它就是類的原型,類的所有例項共享一個原型。如果想訪問這個原型,可以使用 proto 指標。

樣例程式碼:

<!DOCTYPE html><html>

<head>

<meta charset="utf-8">

<title></title>

</head>

<body>

<script>

class Point {

 constructor() { }

}

let p = new Point();

console.log(p.__proto__);      // 注意 proto 指標的寫法

/**

 * 輸出結果:

 * {constructor: ƒ}

 *  constructor: class Point  // 這裡證明: proto 指標指向類的原型

 *  __proto__: Object

 */

let p1 = new Point();

let p2 = new Point();

// 這裡證明:類的所有例項共享一個原型

console.log(p1.__proto__===p2.__proto__);  //true

</script>

</body></html>


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2738419/,如需轉載,請註明出處,否則將追究法律責任。

相關文章