浅谈nodejs中的类定义和继承的套路

2020-06-17 05:43:15易采站长站整理


// 仅适用于Chrome和FireFox,在IE中不工作:
Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
obj.__proto__ = proto;
return obj;
}

我们来测试一下继承。

先定义子类


function Child() {
//老样子,套路1
if (!(this instanceof Child)) {
return new Child();
}
}

然后根据套路4, 调用inherits函数进行原型继承


//注意,inherits调用不在构造函数,也不在原型对象,而是全局调用
inherits(Child, Base);

最后我们调用一下child的printClassName方法,该方法在基类原型对象中实现。

子类调用基类函数-undefined.png

出现错误,child.printClassName()后输出undefined!

为什么呢?

套路5. 子类的构造函数中使用 父类.call(this),实现父类构造函数中的成员变量继承


function Child() {
//老样子,套路1
if (!(this instanceof Child)) {
return new Child();
}

//增加这句话,在调用printClassName就能正常的输出Base字符串
Base.call(this);

//如果要更新基类的成员变量,请在Base.call(this)之后!
this._className = "Child"; //调用printClassName就能正常的输出Child字符串
}

Function.prototype.call()

由此可见,nodejs中的继承需要:

在构造函数中调用 父类.call(this),实现父类成员变量的继承

全局调用inherits(子类,父类) 进行父类成员函数的继承