## 1.關鍵字: instanceof
<script>
<script>
//instanceof 關鍵字
//語法 對象 instanceof 構造函數
//判斷該構造函數的原型是否存在於該對象的原型鏈上
function Person(){
}
//p--->Person.prototype--->Object.prototype--->null
var p = new Person();
//構造函數的**原型**是否在該對象的原型鏈上!
console.log(p instanceof Person);
</script>
## 2.Function的原型鏈
<script>
//Function也能夠被當作一個構造函數
//經過Function new出來函數能夠被當作是實例化的對象
//那麼Function這個構造函數也有原型對象
//Function的原型對象是一個空的函數
//Function的原型對象的原型對象是Object.prototype
var foo = new Function();
console.log(Function.prototype);
//
console.log(Function.prototype.__proto__);
</script>
## 3.Object和Function的關係
<script>
//Object構造函數 是 經過 Function 構造函數 實例化出來的
//Function構造函數 也是 經過 Function 構造函數 實例化出來的(不要強行去理解)
//instanceof
//Object.prototype是否在Function的原型鏈上
//Function-->Function.prototype---->Object.prototype---->null
// console.log(Function instanceof Object); //true
//Function.prototype是否在Functionde原型鏈上
// console.log(Function instanceof Function);
//Object--->Function.prototype---->Object.prototype----->null
// console.log(Object instanceof Function);
// console.log(Object instanceof Object);
</script>
## 4.面向對象的複習總結
1.什麼叫面向對象
面向對象是一種思想
把解決問題的關注點放到解決問題所須要的一系列對象上
面向過程是一種思想
把解決問題的關注點放到解決問題的每個詳細步驟上
2.面向對象的三大特性
封裝
繼承
多態
3.什麼是對象
萬物接對象
4.什麼是js對象
鍵值對兒的集合(無序)
5.名詞提煉法
一句話中的全部的名詞均可以被當作對象
6.如何用js對象模擬現實生活中的對象
屬性對應特徵
方法對應行爲
7.建立對象的方式
使用對象字面量
使用內置的構造函數Object
使用簡單工廠函數(不推薦使用)
自定義構造函數
8.傳統構造函數中存在的問題
若是把方法定義在構造函數中,每建立一個對象,都會新建一個方法,這樣一樣的代碼會在內存中存在多份,形成資源浪費
9.如何解決問題8
把方法提取出來定義在全局中,在構造函數中引用該函數
使用原型來解決,原型中的全部成員均可以被全部跟其關聯的對象訪問
10.原型是什麼
在構造函數建立的時候,系統默認的會爲這個構造函數建立並關聯一個對象,這個對象就是原型對象
這個原型對象默認是一個空的對象,該對象中的全部成員能夠被全部經過該構造函數實例化出來的對象訪問
11.原型的做用
該對象中的全部成員能夠被全部經過該構造函數實例化出來的對象訪問
12.原型的使用方式(實現原型繼承的方式)
1.利用對象的動態特性給原型對象添加成員
2.直接替換原型對象
3.經過混入的方式給原型對象添加成員
13.原型鏈
每個構造函數都有原型對象,每個原型對象都有構造函數,這樣就造成一個鏈式的結構,稱之爲原型鏈
14.繼承的實現方式
1.混入式繼承 for-in
2.原型繼承 經過更改原型鏈的結構,實現的繼承,就是原型繼承
3.經典繼承 Object.creat() 有兼容性問題
//var 對象名 = Object.create(要繼承的對象)
15.Object.prototype的成員
constructor 屬性 指向該原型相關的構造函數
hasOwnProperty 方法 判斷對象自己是否擁有某個屬性 obj.hasOwnProperty("屬性名")
isPrototypeOf 方法 判斷一個對象是否是另外一個對象的原型對象 obj1.isPrototypeOf(obj2)
propertyIsEnumerable 方法 先判斷屬性是否屬於對象自己,若是不是,返回false,若是是,就繼續判斷屬性是否能夠被遍歷,若是是才返回ture 反之則false
toString toLocaleString 方法 轉換成字符串 toLocaleString轉換成本地格式的字符串
valueOf 方法 當對象參加運算的時候,會首先調用valueOf方法獲取對象的值,若是獲取的值不能參與運算,則調用toString方法
__proto__ 屬性 指向對象關聯的原型對象
16.Function eval
均可以將字符串轉換成代碼
不一樣點
Function 建立出來的是函數,不會直接調用,除非手動調用
eval 直接能夠將字符串轉換成代碼,並執行
17.arguments
函數內部的一個對象,在函數調用的時候,系統會默認的將全部傳入的實參存入該對象
arguments.length 表示傳入實參的個數
arguments.callee 指向當前函數 (匿名函數中使用,由於他沒有名字)
## 5.遞歸
### 1.遞歸的概述
<script>
//遞歸
//在函數內調用函數本身,就是遞歸
//沒有遞歸結束條件的遞歸,就是死遞歸
遞歸的兩個要素
//1.本身調用本身
//2.要有結束的條件
//使用遞歸的方法
//化歸思想:
//化歸思想,將一個問題由難化易,由繁化簡,由複雜化簡單的過程稱爲化歸,它是轉化和歸結的簡稱。
//找某我的是否是某個指定的人的兒子
//找到這我的,問他爸是否是指定那我的
//找某我的是否是某個指定的人的曾孫
//找到這我的,問他曾爺爺是否是指定那我的
//1.先找到這我的,問爸是誰
//2.再找他爸,問爺爺是誰
//3.找到爺爺,問增爺爺是誰
//1-100之間的和
//1-1 1
//1-2 1 + 2
//1-3 1 + 2 + 3
//1-4 1 + 2 + 3 + 4
//1-n 1到(n-1)的和 + n
// sum(n ) = sum(n-1)+ n
//函數就求1-n的和
//1 1
//2 3
//3
function sum(n){
if(n == 1)
{
return 1;
}
//return 1+2+3
//return 1+2
return sum(n-1) + n;
}
var num = sum(100);
console.log(num);
// var count = 0;
//
// function test(a,b,c){
// if(count++ == 5){
// return;
// }
// console.log(count);
// test();
// }
//
// test();
</script>
### 2.遞歸的用法
<script>
1.遞歸處理階乘問題
//階乘
//n!
//1*2*3...*n
//1 1
//2 1! * 2
//3 2! * 3
//4 3! * 4
//n (n-1)!*n
//1 1
//2 2
//3 6
function factorial(n) {
if(n == 1){
return 1;
}
//return factorial(2) * 3 6
//return factorial(1) * 2 2
return factorial(n-1) * n;
}
console.log(factorial(5));
2.用遞歸實現斐波那契shulie
//斐波那契 數列
//1 1 2 3 5 8 13 21
//1 1
//2 1
//3 第1項 + 第2項
//4 第2項 + 第3項
//5 第3項 + 第4項
//n (n-2)+(n-1)
function fibonacci(n){
if(n <= 2){
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}
console.log(fibonacci(10));
</script>
### 3.
</script>