簡介:不少概念不清或忘記,從新構建本身的知識體系。天天問本身1~多個問題。我是菜鳥 成爲大神之路!
es6
生成實例對象的傳統方法是經過構造函數函數
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"]
複製代碼