ES5/ES6的继承除了写法以外还有什么区别

2022-10-25 14:13:32 浏览数 (2)

1.class 声明会提升,但不会初始化赋值,类似于let const声明变量

代码语言:javascript复制
  const b=new B();
    function B(){
        this.b=100;
    }
    // 报错 Cannot access 'A' before initializationat
    const a=new A()
    class A{
        constructor(){
            this.a=99
        }
    }

2.class 内部启用了严格模式

代码语言:javascript复制
  class A{
        constructor(){
            //ReferenceError: s is not defined
           s=99
        }
        say(){
          //ReferenceError: z is not defined
            z=99;
            console.log(z)
        }
    }
    const a=new A();
    a.say()

3.class所有方法不可枚举(包括静态方法和实例方法)

代码语言:javascript复制
    class A {
        static eat() {
            console.log("会吃")
        }
        constructor() {
            this.name="tom"
        }
        say() {
            console.log("会说")
        }
    }
    console.log(Object.keys(A))//[]
    console.log(Object.keys(A.prototype))//[]

4.class中方法没有prototype,所有没有constructor,不能使用new调用

代码语言:javascript复制
function b(){
this.a=99
}
const b1=new b()
//普通函数有一个prototype对象,对象中constructor指向函数本身
b===b.prototype.constructor//true

//构造函数的实例对象的__proto__指向构造函数的prototype,
b1.__proto__===b.prototype //true
class Foo {
  constructor() {
    this.foo = 99;
  }
  print() {
    console.log(this.foo);
  }
}
const foo = new Foo();
const fooPrint = new foo.print(); //not a constructor

5.必须使用new 调用class

6.class 内部无法重写类名

0 人点赞