对抗遗忘的方法是复习你的笔记。
看过去的内容立刻就会忘记,用这种问答的方式记录下重点内容,复习的时候,就不用把一篇长文章从头看起。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); // 正确