前端面试之ES6中的继承!

ES6之前并没有给我们提供 extends继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。

1 call()

两个作用:

1 调用这个函数!

2 修改函数运行时this的指向!

调用方法 某个方法.call()来调用!

第一个参数:当前调用函数this的指向!

后面的参数就是一些普通参数了!

      <script>
// call 方法
function fun(a, b) {
console.log('我被调用了!');
// 原来的this是指向的是window
console.log(this) // window
console.log(a + b);
}
var obj = {
description: '函数fun中的this指向被修改了!由原来的window变成了我!'
}
// 1 call() 可以调用函数
// fun.call()
// 修改函数fun中this的指向!
// 第一个参数是当前调用函数this的指向
// 也就是新的指向对象! obj
// 后面的就是一些普通的参数了!
fun.call(obj, 3, 6);
</script>

2 借用构造函数继承父类型属性!

核心原理:通过call()把父类型的this指向子类型的this,这样就可以实现子类型继承父类型的属性!

   <script>
// 借用父构造函数继承属性!
// 1 父构造函数
function Father(uname, age) {
// 父构造函数中的 this指向父构造函数的对象实例
this.uname = uname;
this.age = age;
}
// 子构造函数
debugger
function Son(uname, age) {
// 子构造函数中的 this指向子构造函数的实例 // 这就是借用父构造函数 改变父构造函数中的this指向!
// 因为当前的this是写在子构造函数里面的!
// 所以也就完成了我们的目标 指向子构造函数当中的this!
// 同时我们也可以使用父构造函数中的
// 属性和方法了!
Father.call(this, uname, age);
} var son = new Son('lvhang', 23);
console.log(son);

借用原型对象继承父类型方法!

注意点: 我们要继承原型对象的方法不能够通过简单的原型对象赋值的方式来实现!

原因:这样直接赋值会有问题, 如果修改了子原型对象, 父原型对象也会跟着一起变化! 这就是所谓的浅拷贝! 只拷贝了地址!

解决方法:我们把父构造函数的实例化对象赋值给子构造函数的原型对象不就可以了吗! 因为父构造函数的实例化对象也能通过对象原型指回父构造函数的原型对象,就能够使用父构造函数中的方法了!同时,父构造函数中也不会有我们子构造函数的方法了 !也就完成了我们的目标 ---- 借用父构造函数中的原型对象来实现继承!

 <script>
// 借用父构造函数继承属性!
// 1 父构造函数
function Father(uname, age) {
// 父构造函数中的 this指向父构造函数的对象实例
this.uname = uname;
this.age = age;
}
// 一些共有的属性放在构造函数中
// 一些共有的方法!放在原型对象上!
Father.prototype.Say2 = function () {
console.log('借用原型对象继承父类型方法!');
} function Son(uname, age) {
// 子构造函数中的 this指向子构造函数的实例
Father.call(this, uname, age);
}
// Son.prototype = Father.prototype; 这样直接赋值会有问题, 如果修改了子原型对象, 父原型对象也会跟着一起变化! 这就是所谓的浅拷贝! 只拷贝了地址!
// 新方式 我们把父构造函数的实例化对象赋值给子构造函数的原型!不就可以了吗!
Son.prototype = new Father();
// 这个是子构造函数专门的方法!
Son.prototype.Say = function () {
console.log('shuo');
}
var son = new Son('lvhang', 23);
console.log(son);
console.log(Father.prototype);
</script>

但是,这样还有一个问题, 就是子构造函数的原型对象会被替换成 父构造函数 哈哈哈哈! 是不是感觉又回到了起点!

 console.log(Son.prototype.constructor);

没事儿 没事儿! 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数!

        Son.prototype = new Father();
// 1/如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数!
Son.prototype.constructor = Son;

这不就指回了我们的子构造函数了吗!

前端面试之ES6中的继承!的更多相关文章

  1. 前端面试之ES6新增了数组中的的哪些方法?!

    前端面试之ES6新增了数组中的的哪些方法?! 我们先来看看数组中以前有哪些常用的方法吧! 1 新增的方法! 1 forEach() 迭代遍历数组 回调函数中的三个参数 value: 数组中的每一个元素 ...

  2. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  3. ES5和ES6中的继承 图解

    Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了c ...

  4. ES5和ES6中的继承

    看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...

  5. 前端面试之JavaScript中的闭包!

    前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...

  6. 大厂HR面试必备ES6中的深入浅出面试题知识点

    ESMAScript6简介,ES6是JavaScript语言的下一代标准,目的是让JavaScript语言可以写复杂的大型应用程序,成为企业级语言.那么ECMAScript和JavaScript的关系 ...

  7. JS创建对象、继承原型、ES6中class继承

    面向对象编程:java中对象的两个基本概念:1.类:类是对象的模板,比如说Leader 这个是泛称领导,并不特指谁.2:实例:实例是根据类创建的对象,根据类Leader可以创建出很多实例:liyi,y ...

  8. ES5和ES6中对于继承的实现方法

    在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...

  9. ES5与ES6中的继承

    ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...

随机推荐

  1. ELK原理介绍

    本篇转载自:https://www.cnblogs.com/aresxin/p/8035137.html 为什么使用日志系统: 日志系统记录了系统运行.业务处理的方方面面,在故障排除.业务分析.数据挖 ...

  2. Windows系统/office安装与激活

    一.Windows安装与激活 1.Windows7/8/10安装 提示:       重装系统时C盘会被格式化,故在重装系统前请先手动将重要资料转移到其他地方: 制作一个大白菜U盘winpe启动盘 查 ...

  3. 广告计价方式:CPM,CPC,CPA

    转自知乎链接:https://www.zhihu.com/question/20416888/answer/15076251 1.CPM 收费最科学的办法是按照有多少人看到你的广告来收费.按访问人次收 ...

  4. IntelliJ IDEA错误: 源值1.5已过时,将在未来所有版本中删除

    参考:http://www.jianshu.com/p/451271c4de11

  5. sendfile“零拷贝”和mmap内存映射

    在学习sendfille之前,我们先来了解一下浏览器访问页面时,后台服务器的大致工作流程. 下图是从用户访问某个页面到页面的显示这几秒钟的时间当中,在后台的整个工作过程. 如上图,黑色箭头所示的过程, ...

  6. JAVA编程能力提升学习图

    阿里大神毕玄整理的关于进阶JAVA的学习体系,知道下...

  7. Linux 时间同步 01 简介

    Linux 时间同步 01 简介 目录 Linux 时间同步 01 简介 时间同步 公共NTP服务器地址及IP 系统时间相关文件 时间同步 大数据产生与处理系统是各种计算设备集群的,计算设备将统一.同 ...

  8. JavaScript--总结二(流程控制+调试)

    表达式和语句 表达式------ 一个表达式可以产生一个值,有可能式运算,函数调用,有可能是字面量.表达式可以放在任何需要值的地方 语句----- 语句可以理解为一个行为,循环语句和判断语句就是典型的 ...

  9. js--数组的every()和some()方法检测数组是否满足条件的使用介绍

    前言 阅读本文之前先来思考一个问题,如何如实现判断一个数组中是否存在满足条件的元素,如何去判断数组中是否全部元素都满足判断条件,这里可能能想到使用for循环遍历数组,if()判断每一项是否符合条件,同 ...

  10. TurtleBot3 Waffle (tx2版华夫)(2)系统安装

    Tx2系统默认是安装好的,由于镜像文件大于20G,无法上传百度网盘,所以如有需要请联系我们客服:下面主要是操作步骤: 2.1.准备工作 a.准备好利用Jetpack刷过机的Ubuntu的主机(HOST ...