填坑-十萬個爲何?(23)

簡介:不少概念不清或忘記,從新構建本身的知識體系。天天問本身1~多個問題。我是菜鳥 成爲大神之路!es6

1.Class 的基本語法 Link Class

生成實例對象的傳統方法是經過構造函數函數

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);
複製代碼

引入了 Class(類)這個概念,做爲對象的模板。經過class關鍵字,能夠定義類。ui

//上面的代碼用 ES6 的class改寫,就是下面這樣
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
複製代碼

事實上,類的全部方法都定義在類的prototype屬性上面。this

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

// 等同於
Point.prototype = {
  constructor() {},
  toString() {},
  toValue() {},
};
複製代碼

在類的實例上面調用方法,其實就是調用原型上的方法。spa

class B {}
let b = new B();
b.constructor === B.prototype.constructor // true
`b是B類的實例,它的constructor方法就是B類原型的constructor方法。`
複製代碼

類的內部全部定義的方法,都是不可枚舉的(non-enumerable)。prototype

class Point {
  constructor(x, y) {
    // ...
  }
  toString() {
    // ...
  }
}
Object.keys(Point.prototype)
// []
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]

`上面代碼中,toString方法是Point類內部定義的方法,它是不可枚舉的。這一點與 ES5 的行爲不一致。`
var Point = function (x, y) {
  // ...
};
Point.prototype.toString = function() {
  // ...
};
Object.keys(Point.prototype)
// ["toString"]
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
複製代碼
相關文章
相關標籤/搜索