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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
Dec 22 Javascript
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
Javascript中的包装类型介绍
Apr 02 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
Oct 15 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 06 Javascript
echarts浮动显示单位的实现方法示例
Dec 04 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
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
php微信开发之谷歌测距
2018/06/14 PHP
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
python实现周期方波信号频谱图
2018/07/21 Python
Python中正则表达式的用法总结
2019/02/22 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
生产部岗位职责范文
2014/02/07 职场文书
安全施工责任书
2014/08/25 职场文书
城南旧事电影观后感
2015/06/16 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏