[toc]
#div1.__proto__ -> HTMLDivElement.prototype->HTMLElement.prototype->Element.prototype->Node.prototype->EventTarget.prototype->Object.prototype
## 原型链继承(最常用)
原型继承是我们JS中最常用的一种继承方式
子类B想要继承父类A中的所有属性和方法(私有+公有),只需要让`B.prototype = new A`即可
原型继承的特点:
- 它是把父类中私有的+公有的都继承到子类原型上(子类公有的)
- 支持重写(子类通过`__proto__`修改祖先类的属性和方法)
- 需要手动修正`constructor`
核心:原型继承并不是把父类中的属性和方法克隆一份一模一样的给B,而是让B和A之间增加了原型链的连接,以后B的实例n想要A中的getX方法,需要一级级的向上查找来使用。
```
function Object(){
}
Object.prototype = {
constructor:Object
,hasOwnProperty:function(){}
,...
}
function EventTarget(){
}
EventTarget.prototype = new Object();
EventTarget.prototype.addEventListener = function(){};
function Node(){}
Node.prototype = new EventTarget;
Node.prototype.createElement = function(){}
var node = new Node;
//最后修正constructor
```
![](https://box.kancloud.cn/8776150ddf30da62f2b17aef1b6648eb_431x252.png)
```
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
this.y = 200;
}
B.prototype = new A;
B.prototype.constructor = B;
```
![](https://box.kancloud.cn/bef2d91ea11a59d71852ab016e297564_1543x801.png)
## call继承
`call`继承最终的结果:会把父类私有的属性和方法 克隆一份一模一样的 作为子类私有的属性,和父类**没有直接关系**。
```
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
//this->n
A.call(this); //A.call(n) 把A执行让A中的this变为了n
}
```
```
var n = new B;
console.log(n.x);
```
## 冒充对象继承
把父类私有的+公有的克隆一份一模一样的给子类私有的
```
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
//this->
var temp = new A;
for(var key in temp){
//不能用hasOwnProperty进行判断,否则会继承不到公有的
this[key] = temp[key]
}
temp=null;
}
var n = new B;
```
## 混合模式继承
原型继承+call继承
```
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
A.call(this); //->n.x=100
}
B.prototype = new A; //->B.prototype:x=100 getX...
B.prototype.constructor = B;
```
优势在于B的实例b自己身上拥有A的私有属性而不是通过`__proto__`查找。
## 寄生组合式继承
```
function A(){
this.x = 100;
}
A.prototype.getX = function(){
console.log(this.x);
};
function B(){
A.call(this); //->n.x=100
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
```
```
function objectCreate(o){
function fn(){};
fn.prototype = o;
return new fn;
}
```
## 中间类继承法
```
arguments.__proto__ = Array.prototype
```
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历