>[danger] 原型链继承
*****
参考:
1. JS中所有对象都是Object的实例, Object是所有对象的父亲, 子类原型prototype指向父类实例对象实现继承
```
Student.prototype = new Person();
```
2. 构造函数中, 使用call/apply实现继承, 子类构造函数中, 父类.call(this), 父类.apply(this), 作用是: 让Student内的this可以调用Person内的属性和方法
```
function Student(){
// 区别:
Person.call(this); // call(this,arg1, arg2, arg3 )
Person.apply(this); // apply(this, [arg1, agr2, arg3])
}
Student.prototype = new Person();
```
扩展:
1. ES6 中引入了Class关键字, 转换成ES5以后其实是原型链继承
2. 每个new 出来的对象, 都拥有构造函数和prototype上的属性和方法, 也可以通过原型链去查找继承的属性/方法
3. 可以利用prototype给系统类扩展属性/方法
4. 原型继承方式, 子类实例化, 无法给父类传参, 但使用call可以给父类传参
*****
>[danger] new 都干了什么
*****
new 构造函数, 会让this指向一个全新Object对象,
```
var obj = {};
obj.__proto__ = Base.prototype; // 继承原型里属性/方法
Base.call(obj); // 继承构造函数里属性/方法
```
*****
>[danger] prototype 和 __proto__区别?
*****
1. 方法/类拥有, `__proto__` 和 `prototype`,
对象拥有`__proto__`
2. __proto__解释:
* 一个对象的__proto__指向它构造函数的prototype的值,这也保证了实例能够访问在构造函数和prototype中定义的属性和方法。
* 每个对象的__proto__属性, 是查找方法/类/对象的原型链方式.
```
// b.__proto__ == Boy.prototype 为true (证明1那句话是对的)
// 原型的__proto__指向了它构造函数的prototype的值
```
*****
3. prototype 解释:
(1) 方法除了__proto__还有prototype属性, 指向该方法的原型对象。
总结: a.__proto__指向A.prototype 指向 new Person() 原型对象
>[danger]看下面代码, 有什么问题?
~~~
function Person(){
this.name = "person";
this.grade = {
math: 0
}
}
function Student() {
}
Student.prototype = new Person();
let stu1 = new Student();
stu1.name = "100";
stu1.grade.math = 100;
let stu2 = new Student();
console.log(stu2.name); // name属性没有受到stu1的影响
console.log(stu2.grade.math); // 100 (很明显2个实例对象竟然共享了父类引用类型的数据
console.log(stu2.grade === stu1.grade); // true
~~~
解决方式, 引入[组合继承](%E7%BB%84%E5%90%88%E7%BB%A7%E6%89%BF.md)
- web前端
- CSS问题
- 布局
- 双飞翼布局_flex方式
- 双飞翼布局_margin方式
- 圣杯布局_flex方式
- 圣杯布局_margin方式
- 子元素居中问题
- 弹性布局
- 概念_
- 标准模式与混杂模式
- 各种FC
- line-height
- vertical-align
- CSS3新特性
- 效果
- div添加箭头
- CSS绘制三角形
- JavaScript
- 兼容
- 事件相关
- 原理
- Ajax原理
- 继承原理
- 原型链继承
- 组合继承
- 寄生组合继承
- 数据绑定
- 1单向数据绑定m到c到v
- 2伪双向数据绑定
- 3双向数据绑定
- socket.io
- 运行时
- this指向
- 0.1+0.2问题
- 对象/数组-深拷贝&浅拷贝
- 事件循环
- typeof
- instanceof
- 概念
- 闭包
- 回调函数
- Promise
- 原生对象
- Attribute和property区别
- 防抖函数
- 节流函数
- 语言类型
- Vue
- Vue优缺点
- 仿Vue源码
- 1数据绑定_Observe
- 2数据绑定_订阅者&观察者定义
- 3数据绑定_Vue类实现
- 4数据绑定_Vue访问data更改
- 5DOM编译_Compile_双大括号模板讲解
- 6DOM编译_v-model讲解
- 7DOM编译_v-on:事件绑定讲解
- 项目总结
- 使用Svg图标
- vueCli环境_真机测试
- vueCli集成环信SDK
- 父子组件双向绑定
- React
- React优缺点
- 我的组件库
- Vue的组件库
- 环信_聊天组件
- 面试题
- HTML_分类
- CSS_分类
- JavaScript_分类
- VueJS_分类
- ReactJS_分类
- AngularJS_分类
- 浏览器端
- 笔试题
- CSS
- 特殊布局
- JavaScript_
- 经典_宏任务_微任务
- 浏览器问题
- CORS
- web服务器
- Apache
- 开启跨域
- Nginx
- 常用命令
- 正向代理
- 反向代理
- 负载均衡
- mac安装Nginx
- 配置80端口
- 算法
- 冒泡排序
- 选择排序
- 合并对象_排序
- 杨辉三角
- 红黑树
- 计算机基础
- 网络相关
- OSI七层模型
- http协议
- http工作原理
- https协议
- GET和POST区别
- hosts文件
- php相关
- session机制
- Linux
- 阿里云服务器
- linux使用Mysql
- 安装mysql
- 导入.sql文件
- 远程连接mysql
- linux使用xampp
- 安装Xampp
- 配置web访问
- 域名绑定服务器
- linux搭建git服务器_apache下
- 代码管理
- 什么是git
- 命令行_使用git
- .gitignore文件讲解
- 软件
- VSCode的安装
- 理财
- 基金
- 摄影