前端面试之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. Sharding-JDBC使用jasypt3.0及以上版本加密数据库连接密码

    本文中介绍的是基于Sharding-JDBC 4.0和jasypt 3.0及其以上版本对数据库连接密码进行加密操作 引入依赖 项目的pom.xml中引入maven依赖 <dependency&g ...

  2. 自学python,从小白到大神,需要多久?

    2020年10月 TIOBE 排行榜超过了 Java, 历史上首次 Python 超越了 Java ,再次让许多朋友对 Python 产生了兴趣,今天我们来梳理下学习 Python 几个阶段或者级别, ...

  3. CCNP之OSPF实验报告

    OSPF实验报告 一.实验要求 1.R4为ISP,其上只能配置IP地址:R4与其它所有直连设备间使用公有IP2.R3--R5/6/7为MGRE环境,R3为中心站点3.整个OSPF环境IP地址为172. ...

  4. H3C路由器配置——静态路由

    一.网络畅通条件及排错思路 1.网络畅通的条件 网络畅通的条件:数据包能去能回,也是我们排除网络故障的理论依据. 2.网络不畅通示列 ①.目标主机不可达 原因分析:可能是数据包没有到达目的地,在中途就 ...

  5. 2021年第一个flag

    2021年开始更新本文列出的系列文章,根据书籍和自己的理解整理出spring框架的相关的学习 Spring 的设计理念和整体架构 学习目标 Spring的各个子项目 Spring的设计目标 Sprin ...

  6. easyui中给table列表中加序号

    $('#xyData_healthList').datagrid({ width: 'auto', height: 'auto', striped: true, fit: true, paginati ...

  7. vue-cli Cannot find module 'less'

    首先,今天下午对OneloT项目进行试图修改,我向在在线的时候先将接口中的数据缓存到本地,通过文件写入的方式,但是没有成功,捣鼓了一会.重新启动浏览器,发现命令行报错,error cannot fin ...

  8. codeforces 1451D,一道有趣的博弈论问题

    大家好,欢迎来到codeforces专题. 今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人.难度不太高,依旧以思维为主,坑不多,非常友好. ...

  9. 使用GitHub Actions自动编译部署hexo博客

    前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...

  10. Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程

    Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...