[TOC]
# 1.原型鏈
JavaScript 規定,所有對象都有自己的原型對象(prototype)。一方面,任何一個對象,都可以充當其他對象的原型
> 所有對象皆有__proto__屬性,它指向它的原型對象
# 2.繼承
如何改變this關鍵字的指向call,apply,bind
## 2.1.函數作為普通函數調用,this指向window
```
function show(){
console.log(this);
}
show(); //window
```
```
var name = "cheng"
function show(){
console.log(this.name);
}
show();
```
## Call
```
var name = "cheng"
function show(){
console.log(this.name);
}
var zhang = {
name:"張三"
}
show.call(zhang);
```
## Apply
```
var name = "cheng"
function show(){
console.log(this.name);
}
var zhang = {
name:"張三"
}
show.apply(zhang);
```
## Call和apply之間的區別
如果要傳遞參數,apply跟數組
eg:
```
function show(a,b){
console.log(this.name);
console.log(a+b)
}
var zhang = {
name:"張三"
}
//show.call(zhang,1,2)
show.apply(zhang,[1,2]);
```
## Bind
bind后函數不會執行,而只是返回一個改變了上下文的函數副本,而call和apply是直接執行函數
**demo01**
```
<div id="text">div</div>
<button id="btn">btn</button>
var id = "world"
var btn = document.getElementById("btn");
var text = document.getElementById("text");
btn.onclick = function(){
console.log(this.id); //world
}.bind(this);
```
**demo02**
```
var name = "li";
var cheng = {
name:"cheng"
}
var test = function(){
console.log(this.name)
}.bind(cheng);
test();
```
**demo03定時器**
Eg:在函數內部的定時器中
```
<div id="text">div</div>
<button id="btn">btn</button>
<script>
var id = "world"
var btn = document.getElementById("btn");
var text = document.getElementById("text");
btn.onclick = function(){
setTimeout(function(){
console.log(this.id); //world
},1000)
}
</script>
```
### 解決方案01 bind
```
<div id="text">div</div>
<button id="btn">btn</button>
<script>
var id = "world"
var btn = document.getElementById("btn");
var text = document.getElementById("text");
btn.onclick = function(){
setTimeout(function(){
console.log(this.id);
}.bind(this),1000)
}
</script>
```
### 解決方案 02 self
```
var id = "world"
var btn = document.getElementById("btn");
var text = document.getElementById("text");
btn.onclick = function(){
var self = this;
setTimeout(function(){
console.log(self.id);
},1000)
}
```
### 解決方案 03 箭頭函數
```
<button id="btn">btn</button>
<script>
var id = "world"
var btn = document.getElementById("btn");
var text = document.getElementById("text");
btn.onclick = function(){
setTimeout(()=>{
console.log(this.id)
},1000)
}
</script>
```
# 3.繼承實現
```
var Person = function(name,age){
this.name = name;
this.age = age;
}
Person.prototype.see = function(){
console.log(this.name+"愛看片")
}
function Teacher(name,age){
Person.call(this,name,age);
}
Teacher.prototype = new Person();
var cheng = new Teacher("cheng",20);
cheng.see();
```
- 1.JS的基礎知識
- (1)調試
- (2)變量
- (3)數據類型
- 數據類型之間的轉換
- (4)全局變量和局部變量
- (5)運算符和表達式
- (6)數組
- 2.控制語句DOM,BOM,事件
- (1)控制語句
- (2)DOM的基礎
- 節點
- 改變樣式
- DOM事件
- 3.函數
- (1)聲明函數
- (2)構造函數
- (3)函數的參數
- (4)函數的傳參
- (5)改變this
- (6)重載
- (7)回調函數
- 4.數組
- (1)創建數組
- (2)增刪改查
- (3)字符串與數組的轉換
- 5.正則
- (1)創建正則
- (2)字符串中支持正則
- (3)語法
- 最核心的元字符
- 6.ajax
- (1)原生ajax
- (2)http,get,post
- (3)跨域
- (4)jQuery-ajax
- (5)axios
- 7.面向對象
- (1)原型
- (2)原型鏈,繼承
- (3)多態
- 8.es6小結
- 9.js+canvas實現驗證碼
- 10.js的作用域
- 11.閉包
- 實例
- toggle
- 圖片切換
- swiper
- 遮罩顏色漸變
- 表格添加
- 瀑布流
- ajax數據請求渲染
- 百度地圖