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 相关文章推荐
JScript中的undefined和"undefined"的区别
Mar 08 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
jquery插件jTimer(jquery定时器)使用方法
Dec 23 Javascript
调试代码导致IE出错的避免方法
Apr 04 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
js代码规范之Eslint安装与配置详解
Sep 08 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
JS实现继承的几种常用方式示例
Jun 22 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
详解Js模块化的作用原理和方案
Apr 29 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
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
html读出文本文件内容
2007/01/22 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
python shell根据ip获取主机名代码示例
2017/11/25 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python的flask框架难学吗
2020/07/31 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
什么是Assembly(程序集)
2014/09/14 面试题
英文版网络工程师求职信
2013/10/28 职场文书
厨师岗位职责
2013/11/12 职场文书
硕士研究生个人求职信
2013/12/04 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
失职检讨书大全
2015/01/26 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python