最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-27 22:33:59
文档

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

浅谈nodejs中的类定义和继承的套路:javascript是一门极其灵活的语言。 灵活到你无法忍受! 我个人喜欢强类型的语言,例如c/c++,c#等。 但是js代表着未来,所以需要学习。 js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路。 套路1. 在构造函数(const
推荐度:
导读浅谈nodejs中的类定义和继承的套路:javascript是一门极其灵活的语言。 灵活到你无法忍受! 我个人喜欢强类型的语言,例如c/c++,c#等。 但是js代表着未来,所以需要学习。 js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路。 套路1. 在构造函数(const

javascript是一门极其灵活的语言。

灵活到你无法忍受!

我个人喜欢强类型的语言,例如c/c++,c#等。

但是js代表着未来,所以需要学习。

js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路。

套路1. 在构造函数(constructor)中总是使用instanceof操作符:

function Base() {
 if (!(this instanceof Base)) {
 return new Base();
 }
}

上述代码的含义就是: 如果Base这个函数调用时没有使用new操作符,则会自动调用new操作符,返回Base的实例

套路2. 所有成员变量定义在构造函数(constructor)中

function Base() {
 if (!(this instanceof Base)) {
 return new Base();
 }

 //开始成员变量定义
 this.className = "Base";
}

套路3. 所有的成员方法以函数表达式方式定义在原型(prototype)中【为什么要这样,其原因在套路4中的inherits源码注释中】

Base.prototype.printClassName = function(){
 console.log(this.className);
}

调用如下:

var base = Base(); //不使用new操作符,直接进行函数调用,自动调用new操作符
console.log(base.className);
base.printClassName();

套路4. 使用util.inherits(子类,父类)进行原型(prototype)继承

先来看一下inherits的源码:

var inherits = function(ctor, superCtor) {
 //严格相等测试:undefined/null
 //子类构造函数必须存在
 if (ctor === undefined || ctor === null)
 throw new TypeError('The constructor to "inherits" must not be ' +
 'null or undefined');
 //严格相等测试:undefined/null
 //父类构造函数必须存在
 if (superCtor === undefined || superCtor === null)
 throw new TypeError('The super constructor to "inherits" must not ' +
 'be null or undefined');

 //要点: 如果要继承的话,父类必须要有prototype对象
 //这也是为什么将所有成员方法都定义在prototype对象中!!!
 if (superCtor.prototype === undefined)
 throw new TypeError('The super constructor to "inherits" must ' +
 'have a prototype');

 //让子类构造函数对象增加一个super_指针,指向父类,这样就形成继承链
 ctor.super_ = superCtor;

 //调用Object.setPrototypeOf(子类的prototype,父类的prototype)
 Object.setPrototypeOf(ctor.prototype, superCtor.prototype);
};

Object.setPrototypeOf : 该链接可以了解一下setPrototypeOf方法,非常简单,其Polyfill如下:

// 仅适用于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(子类,父类) 进行父类成员函数的继承

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

浅谈nodejs中的类定义和继承的套路:javascript是一门极其灵活的语言。 灵活到你无法忍受! 我个人喜欢强类型的语言,例如c/c++,c#等。 但是js代表着未来,所以需要学习。 js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路。 套路1. 在构造函数(const
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top