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中:input和input的区别分析
Jul 13 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
深入分析下javascript中的[]()+!
Jul 07 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
Sep 26 Javascript
编写高质量JavaScript代码的基本要点
Mar 02 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
Sep 09 Javascript
js利用clipboardData实现截屏粘贴功能
Oct 12 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
JavaScript实现三级级联特效
Nov 05 Javascript
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
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学习笔记汇总
2014/10/05 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
python函数装饰器用法实例详解
2015/06/04 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
python找出因数与质因数的方法
2019/07/25 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
督导岗位职责
2015/02/04 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android