//继承的几种实现:
//解决方案1.通过原型继承
function Parent1(){
this.name = 'Parent1';
}
function Child1(){}
Child1.prototype = new Parent1();
//问题1:1.父类属性中存在引用类型属性时,会出现共享属性的情况(team属性被所有子类实行共享了)。
function Parent1(){
this.name = 'Parent1';//值类型
this.team = ['aa','bb','cc'];//引用类型
}
function Child1(){}
Child1.prototype = new Parent1();
var c1 =new Child1();
c1.name = 'lilei';
c1.team.push('dd');
console.info(c1.name);//lilei
console.info(c1.team);//["aa", "bb", "cc", "dd"]
var c2 = new Child1();
console.info(c2.name);//Parent1
console.info(c2.team);//["aa", "bb", "cc", "dd"]
//问题2.无法在不影响对象实例的情况下,对父类的构造函数传参
function Parent1(name){
this.name = name;
}
function Child1(){}
Child1.prototype = new Parent1('aa');
var c1 = new Child1();
console.info(c1.name);
Child1.prototype = new Parent1('bb');
var c2 = new Child1();
console.info(c2.name);
//问题3:此时子类的构造函数指向父类的构造函数
function Parent1(){
this.name = 'Parent1';
}
function Child1(){}
Child1.prototype = new Parent1();
console.info(new Child1().constructor);//ƒ Parent1(){ this.name = 'Parent1';}
//解决方案2.通过借用构造函数
function Parent2(){
this.name = 'Parent2';
}
function Child2(){
Parent2.call(this);
this.type = 'Child2';
}
//解决了父属性存在引用类型的问题
function Parent2(){
this.team = ['aa','bb','cc'];
}
function Child2(){
Parent2.call(this);
}
var c1 = new Child2();
c1.team.push('dd');
console.info(c1.team);//["aa", "bb", "cc", "dd"]
var c2 = new Child2();
console.info(c2.team);// ["aa", "bb", "cc"]
//问题:1、父类原型中的方法,子类不可见2.方法在构造函数中定义,函数无法复用。
//解决方案3.使用组合式继承
function Parent3(){
this.name = 'Parent3';
}
Parent3.prototype.talk = function(){
console.info('parent say hi');
}
function Child3(){
Parent3.call(this);//第二次调用Parent3()
this.type = 'Child3'
}
Child3.prototype = new Parent3();//第一次调用Parent3()
Child3.prototype.constructor = Child3();//解决构造函数问题
//问题:1.调用两次构造函数,(在新对象上创建的实例属性'name',屏蔽了原型中的同名属性)
//解决方案4:使用组合继承方法优化
function Parent4(){
this.name = 'Parent3';
}
function Child4(){
Parent4.call(this);//第二次调用Parent3()
this.type = 'Child3'
}
Child4.prototype = Parent4.prototype;
Child3.prototype.constructor = Child3();
//问题:Child4.prototype = Parent4.prototype;该句是将子类的原型直接指向了父类的原型,而从继承的本质上讲应该是父类的原型是子类原型的基础,因此使用到原型继承(克罗克富德提出)的写法Object.create().由此,产生了方案五:寄生组合继承。
//解决方案5:使用寄生组合继承方法
function Parent4(){
this.name = 'Parent3';
}
function Child4(){
Parent4.call(this);//第二次调用Parent3()
this.type = 'Child3'
}
Child4.prototype = Object.create(Parent4.prototype);
Child3.prototype.constructor = Child3();

JS继承实现的几种方式的更多相关文章

  1. 前端js,css文件合并三种方式,bat命令

    前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...

  2. js获取时间戳的三种方式

      js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...

  3. js 函数定义的2种方式

      js 函数定义的2种方式 CreateTime--2018年3月29日18:36:14 Author:Marydon 方式一: /** * 函数式声明 */ function mode() { c ...

  4. js 复制文本的四种方式

    js 复制文本的四种方式 一.总结 一句话总结:js文本复制主流方法:document的execCommand方法 二.js 复制文本的四种方式 纯 转载复制,非原创 原地址:http://www.c ...

  5. js声明变量的三种方式

    JS 声明变量的三种方式 (1)使用变量步骤:a.声明-->b.赋值-->3.调用 正确用法: <script type="text/javascript"> ...

  6. JS对象创建的几种方式整理

    ​ 本文主要介绍了JS对象创建的几种方式 第一种:Object构造函数创建 var Person = new Object(); Person.name = 'Nike'; Person.age = ...

  7. 为Node.js编写组件的几种方式

    本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...

  8. Js 类定义的几种方式

    提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...

  9. js中创建对象的几种方式

    创建对象指创建一个object并给这个对象添加属性和方法,有以下几个方式: 最基本的: var Person={}; Person.name='tom'; Person.age='20'; Perso ...

随机推荐

  1. java异步线程

    使用一个ExecutorService,增加两个不可取消的子线程任务,并且获取他们的返回值. ​ @org.junit.Test public void testFuture() throws Int ...

  2. Windows下Node.js的安装与配置

    一.下载和安装 1. 前往官网https://nodejs.org/或https://nodejs.org/en/download/下载最新推荐版的Node.js,本文使用10.13.0版本. 对于W ...

  3. 【编程之外】从《海贼王》的视角走进BAT的世界

    写在前面的话: 1.从写第一篇博客起到现在篇“纯”技术博客,所以呢-,就想写点不一样的东西,所以就有了这篇文章了 2.本文纯属瞎写,不代表任何第三方的观点.仅仅是出于我对于博客园和那部热血动漫的热爱. ...

  4. BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 14142  Solved: 6049[Subm ...

  5. [LNOI2014]LCA(树剖+线段树)

    \(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...

  6. GoLang学习控制语句之switch

    基本结构 相比较 C 和 Java 等其它语言而言,Go 语言中的 switch 结构使用上更加灵活.它接受任意形式的表达式,例如: switch var1 { case val1: ... case ...

  7. linux服务器ssh免密码登录

    假设有三台服务器的ip分别是10.9.1.101.10.9.1.102.10.9.1.103 修改hosts文件 分别修改三台服务器的hosts的文件(vi /etc/hosts), 在hosts文件 ...

  8. java后端树形菜单使用递归方法

    数据库的设计 使用ssm 实体类 mapper映射文件查询出所有的菜单 使用递归方法

  9. Nginx实现tomcat集群进行负载均衡

    一.背景 随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文就借助nginx来完美的解决这个问 ...

  10. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...