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 相关文章推荐
从阿里妈妈发现的几个不错的表单验证函数
Sep 21 Javascript
JavaScript 原型与继承说明
Jun 09 Javascript
web前端开发也需要日志
Dec 09 Javascript
extjs两个tbar问题探讨
Aug 08 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
js实现单击图片放大图片的方法
Feb 17 Javascript
JavaScript中校验银行卡号的实现代码
Dec 19 Javascript
js 获取json数组里面数组的长度实例
Oct 31 Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
JavaScript的function函数详细介绍
Nov 20 Javascript
JS前端宏任务微任务及Event Loop使用详解
Jul 23 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
python列表的增删改查实例代码
2018/01/30 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
什么是Python中的匿名函数
2020/06/02 Python
python打开文件的方式有哪些
2020/06/29 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
《湘夫人》教学反思
2014/02/21 职场文书
法院授权委托书范文
2014/08/02 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
Python与C++中梯度方向直方图的实现
2022/03/17 Python