博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中的几种继承实现
阅读量:6376 次
发布时间:2019-06-23

本文共 2917 字,大约阅读时间需要 9 分钟。

使用Object.create实现类式继承

下面是官网的一个例子

//Shape - superclassfunction Shape() {  this.x = 0;  this.y = 0;}Shape.prototype.move = function(x, y) {    this.x += x;    this.y += y;    console.info("Shape moved.");};// Rectangle - subclassfunction Rectangle() {  Shape.call(this); //call super constructor.}Rectangle.prototype = Object.create(Shape.prototype);var rect = new Rectangle();rect instanceof Rectangle //true.rect instanceof Shape //true.rect.move(1, 1); //Outputs, "Shape moved."

此时Rectangle原型的constructor指向父类,如需要使用自身的构造,手动指定即可,如下

Rectangle.prototype.constructor = Rectangle;

使用utilities工具包自带的util.inherites

语法

util.inherits(constructor, superConstructor)

例子

const util = require('util');const EventEmitter = require('events');function MyStream() {    EventEmitter.call(this);}util.inherits(MyStream, EventEmitter);MyStream.prototype.write = function(data) {    this.emit('data', data);}var stream = new MyStream();console.log(stream instanceof EventEmitter); // trueconsole.log(MyStream.super_ === EventEmitter); // truestream.on('data', (data) => {  console.log(`Received data: "${data}"`);})stream.write('It works!'); // Received data: "It works!"

也很简单的例子,其实源码用了ES6的新特性,我们瞅一瞅

exports.inherits = function(ctor, superCtor) {  if (ctor === undefined || ctor === null)    throw new TypeError('The constructor to "inherits" must not be ' +                        'null or undefined');  if (superCtor === undefined || superCtor === null)    throw new TypeError('The super constructor to "inherits" must not ' +                        'be null or undefined');  if (superCtor.prototype === undefined)    throw new TypeError('The super constructor to "inherits" must ' +                        'have a prototype');  ctor.super_ = superCtor;  Object.setPrototypeOf(ctor.prototype, superCtor.prototype);};

其中Object.setPrototypeOf即为ES6新特性,将一个指定的对象的原型设置为另一个对象或者null

语法

Object.setPrototypeOf(obj, prototype)

obj为将要被设置原型的一个对象

prototypeobj新的原型(可以是一个对象或者null).

如果设置成null,即为如下示例

Object.setPrototypeOf({}, null);

感觉setPrototypeOf真是人如其名啊,专门搞prototype来玩。

那么这个玩意又是如何实现的呢?此时需要借助宗师__proto__

Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {  obj.__proto__ = proto;  return obj; }

即把proto赋给obj.__proto__就好了。

使用extends关键字

熟悉java的同学应该非常熟悉这个关键字,java中的继承都是靠它实现的。

ES6新加入的class关键字是语法糖,本质还是函数.

使用extends修改之前util.inherits的例子,将会更简单

const EventEmitter = require('events');class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();myEmitter.on('event', function() {  console.log('an event occurred!');});myEmitter.emit('event');

在下面的例子,定义了一个名为Polygon的类,然后定义了一个继承于Polygon的类 Square。注意到在构造器使用的 super(),supper()只能在构造器中使用,super函数一定要在this可以使用之前调用。

class Polygon {  constructor(height, width) {    this.name = 'Polygon';    this.height = height;    this.width = width;  }}class Square extends Polygon {  constructor(length) {    super(length, length);    this.name = 'Square';  }}

使用关键字后就不用婆婆妈妈各种设置原型了,关键字已经封装好了,很快捷方便。

转载地址:http://dnnqa.baihongyu.com/

你可能感兴趣的文章
存储器动态分区算法c语言,动态分区分配算法的详细过程
查看>>
c语言程序中计算圆的面积,C代码:使用概率的方法计算圆的面积
查看>>
2017年九月c语言考试成绩,2017年9月计算机二级C语言操作题
查看>>
linux运维必会MySQL企业面试题近百个
查看>>
TMG2010卸载后,再重新安装报:失败去安装SQL Express 2008 (报告实例)
查看>>
MYSQL+DRBD+HEARTBEAT高可用服务应用指南
查看>>
【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back与Menu&释放粒子内存
查看>>
如何在C++中增加给JavaScript调用的API
查看>>
Exchange 2013 EAC之管理员重置普通用户密码
查看>>
温故2012诺贝尔经济学奖
查看>>
visual studio code调试.net core 2.0程序
查看>>
DNS服务系列之一:泛域名解析的安全案例
查看>>
修改CPAN配置文件
查看>>
【VMCloud云平台】SCVMM准备(一)
查看>>
RHEL6.3实现基于加密的用户认证验证访问
查看>>
SCCM2012 R2实战系列之十一:解决OSD分发Windows7 系统盘盘符为’D’问题
查看>>
Nginx实战进阶篇一 Nginx反向代理及负载均衡实现过程部署
查看>>
经验分享:我是如何在网店无货源情况下快速出单?
查看>>
为何某些文章的阅读量这么高?
查看>>
当AD服务器置于防火墙内时,所需开放的端口
查看>>