對抗遺忘的方法是複習你的筆記。
看過去的內容立刻就會忘記,用這種問答的方式記錄下重點內容,複習的時候,就不用把一篇長文章從頭看起。javascript
前置例子:java
class Point { constructor(x,y){ Object,assign(this, {x, y}) // 以前一版這裏寫錯了 Object.assign(this, x, y), Object.assign裏的參數是對象 } toString(){ return `${this.x}, ${this.y}` // 類的方法裏,使用this訪問類的屬性 } } // 實例 let point = new Point(3, 4)
實例是什麼類型?類和實例有什麼關係?函數
實例是對象類型。用 Object.prototype.call(point)
打印出來的結果是 "[object Object]"
this
實例全稱是類的實例。類至關於實例的構造函數。可是和構造函數相比,只能經過new方法調用,不能自執行。構造函數就是普通函數加一個new修飾符。prototype
point.__proto__ === Point.prototype // true
以上等式在構造函數和實例之間,也是成立的。以下:code
let f = function (){ this.a = 1 this.b = 2 } let o = new f() o.__proto__ === f.prototype //true
實例的屬性哪些是本身的,哪些是原型的?判斷屬性是不是本身的用對象的什麼方法?對象
定義在this上的屬性就是本身的。其餘的,就是原型的。繼承
用hasOwnProperty( )方法判斷屬性是否在對象自身ip
point.hasOwnProperty("toString") // false point.__proto__.hasOwnProperty("toString") // true
實例如何訪問定義在類上的方法?get
類上定義的方法,實例能夠直接訪問
point.toString() // "3,4"
如何給類的某個屬性設置存值和取值函數?
在類的內部使用set和get,對某個屬性設置存值函數和取值函數
javascript class MyClass { constructor() { // ... } get prop() { return 'getter'; } set prop(value) { console.log('setter: '+value); } }
類的屬性名錶達式是什麼,怎麼寫的?
類的屬性名用表達式來寫。將變量寫在方括號裏,以下:
let methodName = "something" [methodName](){ }
類能夠用表達式形式定義嗎?寫一個當即執行的類
能夠。
let person = new class Me{ constructor(name){ this.name = name } sayName(){ consle.log(this.name) } }("joy")
不須要。ES6 實際上把整個語言升級到了嚴格模式。
沒有。所以子類要定義在父類後面。
類的name屬性怎麼取? 類對外是用的什麼符號?
name是class後面的變量名。類對外的符號是等號左邊的變量。
let myPoint = class Point{} myPoint.name // Point // myPoint指代了Point類
某方法以前加了星號(*),表示該方法是geneator函數
類的方法的this指向的是類實例。若是單獨提出來指向的是undefined。讓this指向實例有3種方法: ①構造函數綁定this(函數的bind方法) ②用箭頭函數 ③用proxy,獲取方法的時候,自動綁定this
什麼是靜態方法,舉例說明?如何調用靜態方法?
一個方法前加了static,它就是靜態方法。以下:
class Foo{ static classMethod(){ return "hello" } } Foo.classMethod() //靜態方法在類上調用
靜態方法直接經過類來調用
類中定義的非靜態方法都會被實例繼承。
指向類
寫在constructor 或者寫在頂層,效果同樣。
寫在類的外面 Foo.prop = 1
或者在屬性前加static修飾符 static prop= 2
私有方法和私有屬性,是隻能在類的內部訪問的方法和屬性,外部不能訪問。私有屬性的方法:
①命名區別 ②方法移除到模塊外 ③利用Symbol
值的惟一
私有屬性的提案:
在屬性和方法前面加#,表示私有
new.target屬性的應用場景?
ES6 爲new命令引入了一個new.target屬性,該屬性通常用在構造函數之中,返回new命令做用於的那個構造函數。
能寫出不能獨立使用、必須繼承後才能使用的類
class Shape { constructor() { if (new.target === Shape) { throw new Error('本類不能實例化'); } } } class Rectangle extends Shape { constructor(length, width) { super(); // ... } } var x = new Shape(); // 報錯 var y = new Rectangle(3, 4); // 正確