对抗遗忘的方法是复习你的笔记
看过去的内容马上就会忘记,用这种问答的方式记录下重点内容,复习的时候,就不用把一篇长文章从头看起。

clsss用法:

前置例子:

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)
  1. 实例是什么类型?类和实例有什么关系?

    实例是对象类型。用 Object.prototype.call(point)打印出来的结果是 "[object Object]"

    实例全称是类的实例。类相当于实例的构造函数。但是和构造函数相比,只能通过new方法调用,不能自执行。构造函数就是普通函数加一个new修饰符。

     point.__proto__ === Point.prototype // true

    以上等式在构造函数和实例之间,也是成立的。如下:

    let f = function (){
        this.a = 1
        this.b = 2
    }
    let o = new f()
    o.__proto__ === f.prototype //true
  2. 实例的属性哪些是自己的,哪些是原型的?判断属性是否是自己的用对象的什么方法?

    定义在this上的属性就是自己的。其他的,就是原型的。

    用hasOwnProperty( )方法判断属性是否在对象自身

    point.hasOwnProperty("toString") // false
    point.__proto__.hasOwnProperty("toString") // true
  3. 实例如何访问定义在类上的方法?

    类上定义的方法,实例可以直接访问

     point.toString() // "3,4"
  4. 如何给类的某个属性设置存值和取值函数?

    在类的内部使用set和get,对某个属性设置存值函数和取值函数

    javascript
    class MyClass {
        constructor() {
         // ...
        }
        get prop() {
         return 'getter';
        }
        set prop(value) {
         console.log('setter: '+value);
        }
    }
  5. 类的属性名表达式是什么,怎么写的?

    类的属性名用表达式来写。将变量写在方括号里,如下:

    let methodName = "something"
       [methodName](){
       
       }
  6. 类可以用表达式形式定义吗?写一个立即执行的类

    可以。

    let person = new class Me{
        constructor(name){
            this.name = name
         } 
         sayName(){
            consle.log(this.name)
         }
     }("joy")
  7. ES6内部还需要用use strict吗?

    不需要。ES6 实际上把整个语言升级到了严格模式。

  8. 类有变量提升吗?

    没有。因此子类要定义在父类后面。

  9. 类的name属性怎么取? 类对外是用的什么符号?

    name是class后面的变量名。类对外的符号是等号左边的变量。

    let myPoint = class Point{}
    myPoint.name  // Point
    // myPoint指代了Point类
  10. 如何判别Generator方法?

    某方法之前加了星号(*),表示该方法是geneator函数

  11. 类的方法中的this指向的是什么?如果将方法单独提出来呢?怎么让this指向实例?

    类的方法的this指向的是类实例。如果单独提出来指向的是undefined。让this指向实例有3种方法: ①构造函数绑定this(函数的bind方法) ②用箭头函数 ③用proxy,获取方法的时候,自动绑定this

  12. 什么是静态方法,举例说明?如何调用静态方法?

    一个方法前加了static,它就是静态方法。如下:

    class Foo{
     static classMethod(){
        return "hello"
     }
    }
    Foo.classMethod() //静态方法在类上调用

    静态方法直接通过类来调用

  13. 类中定义的方法,都会被实例继承吗?

    类中定义的非静态方法都会被实例继承。

  14. 静态方法中的this,指向什么?

    指向类

  15. 实例的属性除了写在constructor中,还能写在哪里?

    写在constructor 或者写在顶层,效果一样。

  16. 静态属性如何定义?

    写在类的外面 Foo.prop = 1或者在属性前加static修饰符 static prop= 2

  17. 什么是私有属性和私有方法? 如何区别他们和别的属性或方法。

    私有方法和私有属性,是只能在类的内部访问的方法和属性,外部不能访问。私有属性的方法:

    ①命名区别 ②方法移除到模块外 ③利用Symbol值的唯一

    私有属性的提案:

    在属性和方法前面加#,表示私有

  18. 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);  // 正确

joychenke
47 声望3 粉丝

业精于勤荒于嬉。加油ヾ(◍°∇°◍)ノ゙