美文网首页
★ ES5/ES6 的继承除了写法以外还有什么区别

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

作者: 行走的蛋白质 | 来源:发表于2020-05-29 09:28 被阅读0次
  • class 声明的类,类似于 let const 声明的变量一样会进入暂时性死区
var Foo = function () {
    this.foo = 21;
};

{
    console.log(Foo); // ReferenceError: Cannot access 'Foo' before initialization
    class Foo {
        constructor() {
            this.foo = 37;
        }
    }
}
  • class 声明内部会启用严格模式
function Foo() {
    foo = 123
    console.log(foo)
}
Foo() // 123

class Bar {
    constructor() {
        bar = 123
    }
}
let bar = new Bar() // ReferenceError: Cannot access 'bar' before initialization
  • class 的所有方法 ( 包括静态方法和实例方法 ) 都是不可枚举的
function Foo() {
    this.foo = 18
}
Foo.getF1 = function() {
    console.log(this.foo)
}
Foo.prototype.getF2 = function() {
    console.log(this.foo)
}
console.log(Object.keys(Foo)) // ["getF1"]
console.log(Object.keys(Foo.prototype)) // ["getF2"]

class Bar {
    constructor() {
        this.bar = 18
    }
    static getB1() {
        console.log(this.bar)
    }
    getB2() {
        console.log(this.bar)
    }
}
console.log(Object.keys(Bar)) // []
console.log(Object.keys(Bar.prototype)) // []
  • class 的所有方法 ( 包括静态方法和实例方法 ) 都没有原型对象 prototype,所以也没有 [[constructor]],不能使用 new 来调用
function Foo() {
    this.foo = 18
}
Foo.getF1 = function() {
    console.log(this.foo)
}
Foo.prototype.getF2 = function() {
    console.log(this.foo)
}
const foo = new Foo()
console.log(new foo.getF2()) // Foo.getF2 {}

class Bar {
    constructor() {
        this.bar = 18
    }
    static getB1() {
        console.log(this.bar)
    }
    getB2() {
        console.log(this.bar)
    }
}
const bar = new Bar()
console.log(new bar.getB2()) // TypeError: Bar.getB2 is not a constructor
  • 必须使用 new 来调用 class
class Bar {
    constructor() {
        this.bar = 18
    }
    static getB1() {
        console.log(this.bar)
    }
    getB2() {
        console.log(this.bar)
    }
}
const bar = new Bar()
Bar() // TypeError: Class constructor Bar cannot be invoked without 'new'
  • class 内部无法重写类名
function Bar() {
    Bar = 'Baz'; // it's ok
    this.bar = 42;
}
const bar = new Bar();
console.log(Bar) // 'Baz'
console.log(bar) // Bar {bar: 42}

class Foo {
    constructor() {
        this.foo = 42;
        Foo = 'Fol'; // TypeError: Assignment to constant variable
    }
}
const foo = new Foo();

相关文章

网友评论

      本文标题:★ ES5/ES6 的继承除了写法以外还有什么区别

      本文链接:https://www.haomeiwen.com/subject/mxatzhtx.html