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 相关文章推荐
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
用json方式实现在 js 中建立一个map
May 02 Javascript
Javascript实现颜色rgb与16进制转换的方法
Apr 18 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
javascript实现网页端解压并查看zip文件
Dec 15 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
Nov 02 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 缓冲的免费实现方法
2006/10/09 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
用于table内容排序
2006/07/21 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python实现网页自动签到功能
2019/01/21 Python
pandas 时间格式转换的实现
2019/07/06 Python
Django实现文件上传下载
2019/10/06 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
python三引号如何输入
2020/07/06 Python
python代码能做成软件吗
2020/07/24 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
装修公司管理制度
2015/08/05 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
小学思想品德教学反思
2016/02/24 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
零基础学java之循环语句的使用
2022/04/10 Java/Android