javascript 几种常用继承方法和优缺点分析
1.原型链继承(最简单)
核心 (实现思路):用父类的实例充当子类原型对象
function Person(name) {
    this.name = name;
    this.fav = ['basketball', 'football'];
    this.detail = {country : '中国', city : '江苏'}
}
function Man(name) {
    this.say = function(){console.log('I am man')};
}
Man.prototype = new Person(); //核心
var sam = new Man('sam');
console.log(sam.fav);         //'basketball', 'football'优点
1.简单,容易理解,容易实现
缺点:
1.创建子类实例时无法向父类传参(创建Man时无法传递name信息)
2.引用类型的属性(数组和对象),被所有实例共享,接着上面的代码举个例子
var tyler = new Man('tyler');
tyler.fav.push('badminton');
tyler.rela.area = '建业区'
//修改tyler实例的信息,间接地修改了sam实例的属性
console.log(sam.fav)        // "basketball", "football", "badminton"
console.log(sam.rela)       // {country:'中国',city:'江苏',area:'建邺区'}2.借用构造函数(经典继承)
为了解决原型链继承的两个问题,所以就有了借用构造函数的继承方法。
核心 (实现思路):借父类的构造函数,补充子类的构造函数,相当于把父类的实例属性拷贝一份给子类的实例
function Person(name) {
    this.name = name;
    this.fav = ['basketball', 'football'];
    this.say = function(){console.log('I love china')}
}
function Man(name) {
    Person.call(this, name);     //核心
}
var sam = new Man('sam');
var tyler = new Man('tyler');
tyler.fav.push('badminton');
console.log(sam.name);        //sam
console.log(tyler.name);      //tyler
console.log(sam.fav);         //'basketball', 'football'
console.log(tyler.fav);       //'basketball', 'football', 'badminton'
console.log(sam.say == tyler.say)  //false优点:
1.解决了原型链继承中 实例共享引用类型属性的问题
2.修改了原型链继承中 子类构建无法向父类传递参数的问题
缺点:
1.代码的最后一行显示两个子类实例中的方法并非同一个,即无法实现函数复用,如果实例多的情况下影响性能
3.组合继承(常用)
原型链继承和借用构造函数继承的组合
核心 (实现思路):把实例函数都放在父类的原型对象上面,实现函数复用,同时保留借用构造函数的实现思路。
function Person(name) {
    this.name = name;
    this.fav = ['basketball', 'football'];
}
Person.prototype.say = function(){console.log('I love china')}
function Man(name) {
    Person.call(this, name);     //核心
}
Man.prototype = new Person();
var sam = new Man('sam');
var tyler = new Man('tyler');
tyler.fav.push('badminton');
console.log(sam.name);        //sam
console.log(sam.fav);         //'basketball', 'football'
console.log(sam.say == tyler.say)  //true优点:
1.没有实例共享引用类型的属性的问题
2.子类构造实例时可以通过父类传递参数
3.实现了函数复用
缺点:
1.唯一缺点就是创建一个子类实例时,会调用两次父构造函数,从上面的代码中sam 和Man.prototype 中都包含 fav属性
4.寄生组合式继承(最佳)
为了解决组合继承中的不足,计生组合式继承应运而出了
核心 (实现思路):使用壳函数切掉了原型对象上多余的父类属性
//代码1
function Person(name) {
    this.name = name;
    this.fav = ['basketball', 'football'];
}
Person.prototype.say = function(){console.log('I love china')}
function Man(name) {
    Person.call(this, name);     
}
//关键三步代码
var F = function () {};
F.prototype = Person.prototype;
Man.prototype = new F();
var sam = new Man('sam');
console.log(sam.name);        
//代码2 :对继承的关键三部进行封装
function Person(name) {
    this.name = name;
    this.fav = ['basketball', 'football'];
}
Person.prototype.say = function(){console.log('I love china')}
function Man(name) {
    Person.call(this, name);     
}
function create(o) {
    function F(){};
    F.prototype = o;
    return new F();
}
function inheritFunc(child, parent) {
    var newPrototype = create(parent.prototype);
    //如果没有下面一行代码,sam.constructor会变称Person 而不是Man
    newPrototype.constructor = child;
    child.prototype = newPrototype;
}
var sam = new Man('sam');
console.log(sam.name); 优点:
没有任何缺点就是优点(如果使用麻烦不算缺点的话)
缺点:
理解起来比较绕,使用比较麻烦
 关注公众号
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								      徒手撸一个简单的IOC徒手撸一个简单的IOC Spring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of Control)是什么呢?控制反转,简单来说就是将控制实体Bean的动作交给了Spring容器进行管理。再简单点来说就是例如之前想用一个类,必须new一个,但是使用了Spring那么直接用@Autowired注解或者用xml配置的方式就能直接获得此对象,而且你也不用管它的生命周期啊等等之类的。就不用自己new一个对象了。 如果是之前没有使用IOC的话,那么这些对象的创建以及赋值都是由我们自己创建了,下面简单的演示了如果有上面四个对象依赖的话,那么没有IOC我们必须要创建对象并且赋值。仅仅四个对象就这么多,那么一旦项目大了,对象成百上千,如果还这样写的话,那么绝对是一场灾难。 对象A a = new 对象A(); 对象B b = new 对象B(); 对象C c = new 对象C(); 对象D d = new 对象D(); a.setB(b); a.setC(c); b.setD(d); c.setD(d); 因此在Spring中通过IOC将所有的对象统一放到Spring的容... 
- 
							
								
								    下一篇
								      如何写好C代码之依赖注入依赖注入(Dependency Injection 简写为DI)开发过程中解除耦合的经典手段,但是似乎从一开始这货就是为面向对象而生的,我所看到的示例都没有将C语言考虑在内。难道C语言不能使用这么经典的设计模式?本文就来介绍一下C语言如实使用依赖注入来解除耦合。 参数注入 对应于面向对象语言的构造函数注入,C语言作为过程语言,参数注入法是最简单、也是最直接的方法。最常见的排序方法qsort就是用这种方法: void qsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 可以看到qsort函数的第四个参数compar就是外部依赖的对象(函数),因为不同场景有不同的比较元素大小的方式,通过参数将外部依赖注入,使该函数更加具有通用型,因为实际上我们用qsort,只是用他的排序算法,其他的都是和具体使用场景有关。 设置(set)接口注入 上一篇我们介绍的设置回调函数的方法其实就是使用这种方法,其本质就是专门对外提供一个接口,用来将依赖的外部对象或者函数注入到本模块中来。比如开发一个... 
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- Red5直播服务器,属于Java语言的直播服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL表碎片整理

 
			 
				 
				 
				 
				 
				 
				 
				



 微信收款码
微信收款码 支付宝收款码
支付宝收款码