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 相关文章推荐
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
JS获取键盘上任意按键的值(实例代码)
Nov 12 Javascript
jquery选择checked在ie8普通模式下的问题
Feb 12 Javascript
js全选按钮的实现方法
Nov 17 Javascript
jQuery设置Cookie及删除Cookie实例分析
Apr 15 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
Nov 28 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
AngularJS自定义表单验证功能实例详解
Aug 24 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 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 session和cookie使用说明
2010/04/07 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
基于Python实现一个简单的银行转账操作
2016/03/06 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python for循环生成列表的实例
2018/06/15 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python实现简单坦克大战
2020/03/27 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
scrapy-splash简单使用详解
2021/02/21 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
幼儿园保教管理制度
2014/02/03 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
授权收款委托书范本
2014/10/10 职场文书
教师求职信怎么写
2015/03/20 职场文书
就业意向书范本
2015/05/11 职场文书