super关键字

  this和super的区别:
  this关键词指向函数所在的当前对象
  super指向的是当前对象的原型对象

const EventEmitter  = require('events').EventEmitter;
class Publishorder extends EventEmitter {
    constructor(){
        super();
        setInterval(()=>{
            this.emit('neworder', { price: Math.random() * 100 });
        },3000)
    }
}

  上面写了一个每隔3秒发布一个随机价格订单的事件发射器的类Publishorder,其中super()指的是父类的构造函数,即Nodejs中的events.EventEmitter;如果不去调用父类构造函数,将无法在构造函数中使用this。即抛出这样一个错误:

/Users/xuan/Desktop/Daily Demo/Daily-Demo/Node/eventemitter.js:6
    setInterval(()=>{
    ^
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    at new Publishorder (/Users/xuan/Desktop/Daily Demo/Daily-Demo/Node/eventemitter.js:6:9)
    at Object.<anonymous> (/Users/xuan/Desktop/Daily Demo/Daily-Demo/Node/eventemitter.js:12:22)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

  那么为什么javascript要有这样一个限制?因为有继承关系,子类创建了对象会用到父类的属性方法,所以父类也要初始化,不然继承父类而不用父类的属性和方法,那继承还有什么意义。
  所以,Class中的 super(),它在这里表示父类的构造函数,用来新建父类的 this 对象。
这里的super()相当于Parent.prototype.constructor.call(this)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!