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 相关文章推荐
ExtJS 设置级联菜单的默认值
Jun 13 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
jquery实现可拖拽弹出层特效
Jan 04 Javascript
jQuery仿gmail实现fixed布局的方法
May 27 Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
浅析如何利用angular结合translate为项目实现国际化
Dec 08 Javascript
vue-cli如何引入bootstrap工具的方法
Oct 19 Javascript
利用hasOwnProperty给数组去重的面试题分享
Nov 05 Javascript
vue地址栏直接输入路由无效问题的解决
Nov 15 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
May 19 Javascript
微信小程序实现录音Record功能
May 09 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调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
php中JSON的使用方法
2015/04/30 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP的PDO连接讲解
2019/01/24 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
python编写微信公众号首图思路详解
2019/12/13 Python
Python使用进程Process模块管理资源
2020/03/05 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
户外用品商店创业计划书
2014/01/29 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
西湖英语导游词
2015/02/06 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
稽核岗位职责范本
2015/04/13 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015暑假假期总结
2015/07/13 职场文书