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 ui dialog里调用datepicker的问题
Aug 06 Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
Dec 25 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
详解JS面向对象编程
Jan 24 Javascript
Angular.js中$resource高大上的数据交互详解
Jul 30 Javascript
详解如何为你的angular app构建一个第三方库
Dec 07 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 Javascript
js实现车辆管理系统
Aug 26 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 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源码之explode使用说明
2011/08/05 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
详解JS面向对象编程
2016/01/24 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
python绘图库Matplotlib的安装
2014/07/03 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
使用Python操作MySQL的小技巧
2020/09/10 Python
python通过cython加密代码
2020/12/11 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
Java里面有没有全局变量?为什么?
2015/02/06 面试题
财务负责人岗位职责
2015/02/03 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL