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 相关文章推荐
jQuery阻止事件冒泡具体实现
Oct 11 Javascript
禁止空格提交表单的js代码
Nov 17 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
angularjs实现猜大小功能
Oct 23 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
May 10 Javascript
JavaScript如何操作css
Oct 24 Javascript
可拖拽组件slider.js使用方法详解
Dec 04 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
关于webpack代码拆分的解析
2017/07/20 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
前端路由&webpack基础配置详解
2019/06/10 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
python3获取当前目录的实现方法
2019/07/29 Python
用python写爬虫简单吗
2020/07/28 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
运动会通讯稿150字
2014/02/15 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
现金出纳岗位职责
2014/03/15 职场文书
读书活动总结
2014/04/28 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
初中毕业感言300字
2015/07/31 职场文书
酒店员工管理制度
2015/08/05 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
JS函数式编程实现XDM一
2022/06/16 Javascript