前端面试之ES6中的继承!
前端面试之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中的继承!的更多相关文章
- 前端面试之ES6新增了数组中的的哪些方法?!
前端面试之ES6新增了数组中的的哪些方法?! 我们先来看看数组中以前有哪些常用的方法吧! 1 新增的方法! 1 forEach() 迭代遍历数组 回调函数中的三个参数 value: 数组中的每一个元素 ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- ES5和ES6中的继承 图解
Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了c ...
- ES5和ES6中的继承
看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...
- 前端面试之JavaScript中的闭包!
前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...
- 大厂HR面试必备ES6中的深入浅出面试题知识点
ESMAScript6简介,ES6是JavaScript语言的下一代标准,目的是让JavaScript语言可以写复杂的大型应用程序,成为企业级语言.那么ECMAScript和JavaScript的关系 ...
- JS创建对象、继承原型、ES6中class继承
面向对象编程:java中对象的两个基本概念:1.类:类是对象的模板,比如说Leader 这个是泛称领导,并不特指谁.2:实例:实例是根据类创建的对象,根据类Leader可以创建出很多实例:liyi,y ...
- ES5和ES6中对于继承的实现方法
在ES5继承的实现非常有趣的,由于没有传统面向对象类的概念,Javascript利用原型链的特性来实现继承,这其中有很多的属性指向和需要注意的地方. 原型链的特点和实现已经在之前的一篇整理说过了,就是 ...
- ES5与ES6中的继承
ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...
随机推荐
- Ubuntu命令集(持续更新)
Ubuntu命令集,生活工作汇总,没有顺序.(持续更新...) 1 pwd:没有参数,在终端现实我们当前所处的文件夹位置:ctrl+l:清除当前终端屏: 2 --------------------- ...
- Autofac官方文档翻译--二、解析服务--2隐式关系类型
Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...
- Mac 下 IDEA 启动慢的问题
转自: http://blog.csdn.net/KingBoyWorld/article/details/73440717 从控制台来看,每次都会连接本地地址(127.0.0.1),问题可能就出在这 ...
- LeetCode数组移除数组中目标元素等题目
一种自己解题,一种高赞解题 /** * 移除数组中目标元素,返回新数组长度 * @param nums * @param val * @return */ public int removeEleme ...
- [leetcode72]166. Fraction to Recurring Decimal手动实现除法
让人火大的一道题,特殊情况很多 不过也学到了: java中int类型的最大值的绝对值比最小值的绝对值小1 int最小值的绝对值还是负的,除以-1也是 这种时候最好转为long类型进行处理 long n ...
- java类的定义位置
java的类可以定义在任何位置: 一般的类是一个文件里面写一个类,且类名和文件名相同,但是定义类的位置可以是任意的如图: 上图示例: public class A{ class B{ } static ...
- linux IP 注释
DEVICE=name,这里name是物理设备的名字(动态分配的PPP设备应当除外,它的名字是"逻辑名". IPADDR=addr, 这里addr是IP地址. NETMASK=ma ...
- Mirai框架qq机器人教程
Mirai框架qq机器人教程 0.前言 1. 安装Java 2.安装Mirai启动器 3.下载IDEA或其他编译器 4.创建mirai-console插件项目 4.1 通过git创建 4.2 通过插件 ...
- Go语言从入门到放弃(四)
前言 有段时间没摸Go语言了,最近B站的Go语言泄露挺火的. 还差的很远呐 学无止境 本章主要介绍一些零碎的小知识点 变更记录 # 19.4.30 起笔 # 19.4.30 增加代码打包步骤 正文 ...
- 【JDBC核心】数据库连接池
数据库连接池 传统模式 使用数据库的传统模式: 在主程序(servlet.beans等)中建立数据库连接: 进行 SQL 操作: 断开数据库连接. 这种模式存在的问题: JDBC 连接数据库的方式(四 ...
