javascript中的3种继承实现方法


Posted in Javascript onJanuary 27, 2016

使用Object.create实现类式继承

下面是官网的一个例子

//Shape - superclass
function Shape() {
 this.x = 0;
 this.y = 0;
}

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info("Shape moved.");
};

// Rectangle - subclass
function 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); // true
console.log(MyStream.super_ === EventEmitter); // true

stream.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为将要被设置原型的一个对象
prototype为obj新的原型(可以是一个对象或者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关键字是语法糖,本质还是函数.

在下面的例子,定义了一个名为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';
 }
}

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

Javascript 相关文章推荐
关于Javascript 的 prototype问题。
Jan 03 Javascript
javascript之锁定表格栏位
Jun 29 Javascript
jQuery中对节点进行操作的相关介绍
Apr 16 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
Feb 10 Javascript
全系IE支持Bootstrap的解决方法
Oct 19 Javascript
理解JS绑定事件
Jan 19 Javascript
domReady的实现案例
Nov 23 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 jQuery
Vue.js对象转换实例
Jun 07 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 #Javascript
js实现的彩色方块飞舞奇幻效果
Jan 27 #Javascript
JavaScript下的时间格式处理函数Date.prototype.format
Jan 27 #Javascript
基于JavaScript实现瀑布流效果(循环渐近)
Jan 27 #Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 #Javascript
js实现简单排列组合的方法
Jan 27 #Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 #Javascript
You might like
聊天室php&mysql(五)
2006/10/09 PHP
php数组一对一替换实现代码
2012/08/31 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
pycharm创建一个python包方法图解
2019/04/10 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
知识改变命运演讲稿
2014/05/21 职场文书
体现团队精神的口号
2014/06/06 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
交通事故被告答辩状
2015/05/22 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python