ES5中的继承

一 原型链继承

原型链继承的原理:直接让子类的原型对象指向父类实例,当子类实例找不到对应的属性和方法时,就会往它的原型对象,也就是父类实例上找,从而实现对父类的属性和方法的继承。

// 父类
function fat () {this.name = 'zaq'
}
// 父类上的原型方法
fat.prototype.getName = function() {return this.name
}
// 子类
function child () {}
// 子类的原型对象方法指向父类 子类中找不到的属性方法就会向父类找
child.prototype = new fat()
// 不影响继承 顺便绑一下constructor
child.prototype.constructor = child
// child实例就可以访问父类及其原型上的属性和方法了
const Child = new child()
Child.name // 'zaq'
Child.getName() // 'zaq'

原型链继承的缺点

1、所有的child实例原型都指向同一个fat实例,因此对child实例修改某个父类引用类型会影响所有的child实例;
2、创建子类时无法向父类传参,没有实现super()的功能

function fat () {this.name = 'zaq'
}fat.prototype.getName = function() {return this.name
}function child () {}
child.prototype = new fat()
child.prototype.constructor = child
//
const Child1 = new child();
const Child2 = new child();
Child1.name = 'lsq'
console.log(Child1.name) // lsq
// 本来父类name属性是zaq 然后现在==
console.log(Child2.name) // lsq

以上出现了一个致命错误,应该是父类的引用类型,感谢春神的提醒

// **更正一个错误,感谢春神提醒**
function fat () {this.name = ['zaq']
}fat.prototype.getName = function() {return this.name
}function child () {}
child.prototype = new fat()
child.prototype.constructor = child
//
const Child1 = new child();
const Child2 = new child();
Child1.name.splice(0,0,'xyc')
console.log(Child1.name) // ['xyc', 'zaq']
// 本来父类name属性是zaq 然后现在==
console.log(Child2.name) // ['xyc', 'zaq']

二 构造函数继承

构造函数继承:在子类的构造函数中执行父类的构造函数,并为其绑定子类的this。让父类的构造函数把成员的属性和方法都挂在子类的this上,这样既避免了共用一个原型实例,又能像父类构造函数传参。

function fat (name) {this.name = name
}
fat.prototype.getName = function() {return this.name
}
function Child () {fat.call(this, 'zaq')
}
const child1 = new Child()
const child2 = new Child()
child1.name = 'xyc'
console.log(child1.name) // xyc
console.log(child2.name) // zaq

构造函数继承的缺点

继承不到父类上的属性和方法

child1.getName() // Uncaught TypeError: child1.getName is not a function

三 组合式继承
既然原型链继承和构造函数继承都有各自的缺点但是又能互补,那何不将两者结合起来使用;

function fat (name) {this.name = name
}
fat.prototype.getName = function() {return this.name
}
// 构造函数继承
function Child () {fat.call(this, 'zaq')
}
// 原型链继承
Child.prototype = new fat()
Child.prototype.constructor = Childconst child1 = new Child()
const child2 = new Child()
child1.name = 'lsq'
console.log(child1.name) // lsq
console.log(child2.name) // zaq
child1.getName() // lsq

组合式继承的缺点

每次创建子类实例都执行了两次构造函数(fat.call()和new fat()),虽然不影响继承,但是在子类创建时 原型中会存在两份相同的属性和方法。

四 寄生式组合继承

为了解决构造函数被执行两次的问题,我们将指向父类实例 变成转向父类原型,减少一次构造函数的执行

function fat (name) {this.name = name
}
fat.prototype.getName = function() {return this.name
}
// 构造函数继承
function Child () {fat.call(this, 'zaq')
}
// 原型链继承
Child.prototype = fat.prototype // 将指向父类实例转成转向父类原型
Child.prototype.constructor = Childconst child1 = new Child()
const child2 = new Child()
child1.name = 'lsq'
console.log(child1.name) // lsq
console.log(child2.name) // zaq
child1.getName() // lsq

但是这种方法也存在一个问题,就是子类和父类的原型都指向同一个对象,如果我们对子类原型操作就会对父类原型产生影响。比如给子类Child.prototype新增一个getName方法,那么父类fat.prototype也增加或是被覆盖一个getName方法。为了解决这个问题 我们给fat.prototype做一个浅拷贝;

function fat (name) {this.name = name
}
fat.prototype.getName = function() {return this.name
}
// 构造函数继承
function Child () {fat.call(this, 'zaq')
}
// 原型链继承
Child.prototype = Object.create(fat.prototype) // 将指向父类实例转成转向父类原型
Child.prototype.constructor = Childconst child1 = new Child();
const child2 = new fat();
child1.getName() // zaq
child2.getName() // undefined

到这里我们就完成了es5里的继承,有空更新es6的继承方法

ES6中的继承

class介绍 来自阮一峰

es6中的继承:
1、class可以理解为functon,由于class本质还是一个function,因此它也有一个prototype属性。当new一个class时,会把class的protortype属性赋值给这个新对象的_proto_属性上;
2、constructor是默认添加的方法,在new一个对象的时候,会自动调用该方法, constructor里定义自己的属性;
3、继承extends和super, class子类名 extends父类名 实现继承。当然,还得在constructor里写上super (父类的参数),意思就是在子类中获取父类的this指针,相当于fat.call(this),参考

// 父类
class fat {constructor(props) {this.name = props || '';}getName () {return this.name}
}
// 继承
class Child extends fat {constructor(props, attrs) { // props继承父类的属性,attrs自己私有的属性super(props); // 相当于获取父类的this指向this.rename = props.rename || ''this.attrs = attrs}// 子类自己的方法getFatname () {return this.name}getAttrs () {return this.attrs}
}
// 通过new实例化一个构造函数
const child1 = new Child({name: 'zaq',rename: 'zwj'
}, 'mine attrs')
child1.getName() // zaq
child1.getRename() // zwj
child1.getAttrs() // mine attrs

end… 散会

es5/es6 继承总结相关推荐

  1. ES5 和ES6 继承机制

    为什么80%的码农都做不了架构师?>>>    ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this)).ES ...

  2. ES5和ES6继承的区别

    ES5的继承方法可以看这篇: https://blog.csdn.net/qq593249106/article/details/83098432 ES5与ES6的继承方法对照: ES5 functi ...

  3. ES5、ES6 继承

    es5继承类型: 原型链继承:让构造函数的原型指向父类的实例,缺点是子类没有办法构建私有属性,对一个子类实例的属性进行更改,会改变所有子类的实例 function Parent(){this.name ...

  4. ES5继承和ES6继承的区别

    ES5的继承:实质是先 创造 子类的实例对象this,然后再将父类实的方法添加到this上( Parent.apply(this) ) function Parent(name){this.name ...

  5. ES5的继承和ES6的继承

    ES5 的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this(Parent.apply(this)) ES6 的继承机制完全不同,实质上是先创建父类的实例对象this(所以必须先调用父 ...

  6. es5 vs es6 继承

    ES5 继承 借助构造函数继承(call, apply);无法继承父级原型上属性和方法 function Animal(name, txt) {console.log('构造函数:Animal', t ...

  7. es6继承 vs js原生继承(es5)

    最近在看es2015的一些语法,最实用的应该就是继承这个新特性了.比如下面的代码: 1 $(function(){ 2 class Father{ 3 constructor(name, age){ ...

  8. ES6 继承(复习原型链继承)

    2019独角兽企业重金招聘Python工程师标准>>> 原型链继承 <script type="text/javascript">/* 原型链 继承 ...

  9. Js Array数组ES5/ES6常用方法

    Js Array数组ES5/ES6常用方法 1.栈方法(先进后出) push():在数组的最后一项后追加值(参数:可以为多个值或数组) 返回:数组的长度,改变了原数组. var a=[1,2,3] a ...

最新文章

  1. 阿里暴跌近6%,蒸发2400亿!拼多多火了,股价暴涨近15%!这个幕后的程序员开挂了,马云,刘强东都怕!...
  2. 月薪20k-50k| 西人马3D机器视觉算法、语音识别、DSP软件工程师招聘
  3. openresty nginx升级版
  4. 一次网站性能排查实录
  5. iframe 禁止打开新窗口_教育部新政策:禁止中学生复读?
  6. TIMESTAMP和DATETIME哪个好
  7. C#发现之旅第二讲 C#-XSLT开发
  8. 时间同步服务器java,Windows 配置时间同步服务器以及配置时间同步间隔
  9. java se 9.0.4_jre 9下载(Java SE Runtime Environment)下载
  10. python-函数-变量的作用域-全局变量
  11. 【算法】剑指 Offer 47. 礼物的最大价值
  12. 双重差分模型能做固定效应吗_互助问答第53期:控制时间效应、交互项等问题...
  13. 职场中几个最忌讳的行为模式。
  14. SVN提交时显示:Path is not a working copy directory
  15. CSDN博客下载器v2.4发布
  16. SQL 同比环比增长率计算
  17. 本地运行Flink-DIMAPP出现问题
  18. excel任意单元格中自动插入页码和总页数
  19. 服装店铺装修有哪些窍门?做好这3点,顾客主动上门
  20. 安卓手机如何查看手机控制台输出

热门文章

  1. 新课程研究杂志新课程研究杂志社新课程研究编辑部2023年第12期目录查阅
  2. 位, 字节和字 bit, byte and word
  3. Python如何读取Excel表内容
  4. 微信小程序客服统计功能:小程序客服能统计考勤和工作量了
  5. halcon第十一讲:基于训练学习的木板纹理识别
  6. 【软考系统架构设计师】2022下案例分析历年真题
  7. 第02章_java基础语法
  8. 瀑布模型、快速原型模型、增量模型、螺 旋模型的优缺点,说明每种模型的使用范围
  9. 现如今上海还有哪些牛B的互联网公司?
  10. java使用MD5进行不可逆加密