Class類的特性(上)

Class類的特性(上)函數

ES6 的類,徹底能夠看做ES5構造函數的另外一種寫法。

class Point {
  // ...
}

typeof Point // "function"
Point === Point.prototype.constructor // true
上面代碼代表,類的數據類型就是函數,類自己就指向構造函數。

構造函數的prototype屬性,在 ES6 的「類」上面繼續存在。事實上,類的全部方法都定義在類的prototype屬性上面。

class Point {
  constructor() {
    // ...
  }

  toString() {
    // ...
  }

  toValue() {
    // ...
  }
}

// 等同於

Point.prototype = {
  constructor() {},
  toString() {},
  toValue() {},
};








Object.assign只拷貝當前那一層的基本數據類型
let target = {a: 123};
let source1 = {b: 456};
let source2 = {c: 789,data:{ff:1}};
let obj = Object.assign(target, source1, source2);

console.log(obj)  //{a: 123, b: 456, c: 789, data: {ff:1}}
obj.data.ff       //1
source2 .data.ff="fffffffff"
console.log(obj)  //{a: 123, b: 456, c: 789, data: {ff:fffffffff}}
obj.data.ff        //"fffffffff"


類不顯式定義constructor的話,引擎會自動加。
類必須new調用,而構造函數能夠直接調用。


constructor方法默認返回實例對象(即this),徹底能夠指定返回另一個對象。

class Foo {
  constructor() {
    return Object.create(null);
  }
}

new Foo() instanceof Foo
// false
上面代碼中,constructor函數返回一個全新的對象,結果致使實例對象不是Foo類的實例。


與 ES5 同樣,實例的屬性除非顯式定義在其自己(即定義在this對象上),不然都是定義在原型上(即定義在class上)。


//定義類
class Point {

  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }

}

var point = new Point(2, 3);

point.toString() // (2, 3)

point.hasOwnProperty('x') // true
point.hasOwnProperty('y') // true
point.hasOwnProperty('toString') // false
point.__proto__.hasOwnProperty('toString') // true
上面代碼中,x和y都是實例對象point自身的屬性(由於定義在this變量上),因此hasOwnProperty方法返回true,而toString是原型對象的屬性(由於定義在Point類上),因此hasOwnProperty方法返回false。這些都與 ES5 的行爲保持一致。



因爲本質上,ES6 的類只是 ES5 的構造函數的一層包裝,因此函數的許多特性都被Class繼承,包括name屬性。
name屬性老是返回緊跟在class關鍵字後面的類名。



總結:
類中的方法能被實例繼承。
類中的this指向實例。

static方法(靜態方法):不能被實例調用,只能被類調用。父類中的static方法,能被子類繼承。
static方法中的this指向類。

實例屬性:以前通常在constructor()方法裏面定義。如今直接與實例方法同級定義。(實例屬性的新寫法)

靜態屬性:static prop = 1;新寫法,直接在前加static。只能被類調用。

私有方法和私有屬性:是隻能在類的內部訪問的方法和屬性,外部不能訪問。(做用域影響)
私有屬性和私有方法:目前是提案,是前面加# 如:#a。

 

this

相關文章
相關標籤/搜索