JavaScript是如何实现继承的(六种方式)


Posted in Javascript onMarch 31, 2016

前言:大多OO语言都支持两种继承方式: 接口继承和实现继承 ,而ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,而且其实现继承主要是依靠 原型链 来实现。

1.原型链

基本思想:利用原型让一个引用类型继承另外一个引用类型的属性和方法。

构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

原型链实现继承例子:

function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
}
function subType() {
this.property = false;
}
//继承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function (){
return this.property;
}
var instance = new SubType();
console.log(instance.getSuperValue());//true

2.借用构造函数

基本思想:在子类型构造函数的内部调用超类构造函数,通过使用call()和apply()方法可以在新创建的对象上执行构造函数。

例子:

function SuperType() {
this.colors = ["red","blue","green"];
}
function SubType() {
SuperType.call(this);//继承了SuperType
}
var instance1 = new SubType();
instance1.colors.push("black");
console.log(instance1.colors);//"red","blue","green","black"
var instance2 = new SubType();
console.log(instance2.colors);//"red","blue","green"

3.组合继承

基本思想:将原型链和借用构造函数的技术组合在一块,从而发挥两者之长的一种继承模式。

例子:

function SuperType(name) {
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
}
function SubType(name, age) {
SuperType.call(this,name);//继承属性
this.age = age;
}
//继承方法
SubType.prototype = new SuperType();
Subtype.prototype.constructor = Subtype;
Subtype.prototype.sayAge = function() {
console.log(this.age);
}
var instance1 = new SubType("EvanChen",18);
instance1.colors.push("black");
consol.log(instance1.colors);//"red","blue","green","black"
instance1.sayName();//"EvanChen"
instance1.sayAge();//18
var instance2 = new SubType("EvanChen666",20);
console.log(instance2.colors);//"red","blue","green"
instance2.sayName();//"EvanChen666"
instance2.sayAge();//20

4.原型式继承

基本想法:借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型。

原型式继承的思想可用以下函数来说明:

function object(o) {
function F(){}
F.prototype = o;
return new F();
}

例子:

var person = {
name:"EvanChen",
friends:["Shelby","Court","Van"];
};
var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
console.log(person.friends);//"Shelby","Court","Van","Rob","Barbie"

ECMAScript5通过新增Object.create()方法规范化了原型式继承,这个方法接收两个参数:一个用作新对象原型的对象和一个作为新对象定义额外属性的对象。

var person = {
name:"EvanChen",
friends:["Shelby","Court","Van"];
};
var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
console.log(person.friends);//"Shelby","Court","Van","Rob","Barbie"

5.寄生式继承

基本思想:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象。

例子:

function createAnother(original) {
var clone = object(original);
clone.sayHi = function () {
alert("hi");
};
return clone;
}
var person = {
name:"EvanChen",
friends:["Shelby","Court","Van"];
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi();///"hi"

6.寄生组合式继承

基本思想:通过借用函数来继承属性,通过原型链的混成形式来继承方法

其基本模型如下所示:

function inheritProperty(subType, superType) {
var prototype = object(superType.prototype);//创建对象
prototype.constructor = subType;//增强对象
subType.prototype = prototype;//指定对象
}

例子:

function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function (){
alert(this.name);
};
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
inheritProperty(SubType,SuperType);
SubType.prototype.sayAge = function() {
alert(this.age);
}

以上内容给大家介绍了javascript实现继承的六种方式,希望对大家有所帮助!

Javascript 相关文章推荐
jQuery实现简单的间隔向上滚动效果
Mar 09 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
浅谈JavaScript中null和undefined
Jul 09 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
详解Ant Design of React的安装和使用方法
Dec 27 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 Javascript
node.js express捕获全局异常的三种方法实例分析
Dec 27 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 #Javascript
javascript检查某个元素在数组中的索引值
Mar 30 #Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 #Javascript
谈一谈js中的执行环境及作用域
Mar 30 #Javascript
js实现(全选)多选按钮的方法【附实例】
Mar 30 #Javascript
用JS生成UUID的方法实例
Mar 30 #Javascript
如何通过js实现图片预览功能【附实例代码】
Mar 30 #Javascript
You might like
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
python基础教程之常用运算符
2014/08/29 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
vscode调试django项目的方法
2020/08/06 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
解决python3输入的坑——input()
2020/12/05 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
领导党性分析材料
2014/02/15 职场文书