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