繼承
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9M2VhlGZXF2as1WZxEjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TO1gzMyMzM5AzNyYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
構造函數.prototype的成員:
//Function函數所有的參數全都是字元串(初始化)
//Function函數的作用就是将所有的參數組合起來,變成一個函數
arguments對象
在每一個函數調用的過程中, 函數代碼體内有一個預設的對象
arguments
, 它存儲着實際傳入的所有參數。
arguments
是一個僞數組對象. 它表示在函數調用的過程中傳入的所有參數的集合。在函數調用過程中不規定參數的個數與類型, 可以使得函數調用變得非常靈活性。
JavaScript中的函數并沒有規定必須如何傳參:
1. 定義函數的時候不寫參數, 一樣可以調用時傳遞參數
2. 定義的時候寫了參數, 調用的時候可以不傳參
3. 定義的時候寫了一個參數, 調用的時候可以随意的傳遞多個而參數
在代碼設計中, 如果需要函數帶有任意個參數的時候, 一般就不帶任何參數, 所有的參數利用
arguments
對象來擷取. 一般的函數定義文法, 可以寫成:
function foo (/* ... */) {}
callee指代正在運作這個函數的自身(目前運作的函數)
## 繼承
### 混入式繼承
for in
使用for in周遊對象1的屬性,将所有的屬性添加到另外一個對象2上
這時候就可以稱 對象2 繼承自 對象1
### 原型繼承
*利用對象的動态特性,為原型對象添加成員
*直接替換原型對象
1.替換前的對象,在替換之後,所有的成員都丢失
2.替換原型對象的時候,需要手動去指定原型對象的construtor屬性
*利用混入給原型對象添加成員
### 經典繼承
```js
var 對象1 = Object.create(對象2);
```
這個時候,建立出來的對象1繼承自對象2
Object.create方法存在相容性問題
如何解決?
1.檢測浏覽器是否支援Object.create方法,如果不支援,直接手動給Object添加create方法
2.自定義函數,在函數内部判斷浏覽器是否支援Object.create方法,如果不支援,則手動建立對象傳回,否則直接調用
```js
function create(obj){
if(Object.create){
return Object.create(obj);
}else{
function F(){
}
F.prototype = obj;
return new F();
}
}
```
## 原型鍊
### 什麼是原型鍊
每個構造函數都有原型對象,每個對象都有構造函數,每個構造函數的原型對象都是對象,也就有構造函數
然後就形成一個鍊式的結構,我們稱之為原型鍊
### 原型繼承是什麼?
通過修改原型鍊的結構,實作繼承的方式就是原型繼承
### 對象和原型的成員關系
```js
function Person(){};
var p = new Person();
```
p對象中包含的成員有:Person.prototype中的成員和自身擁有成員
Person.prototype中的成員有:Object.prototype的成員和自身的成員
p對象可以通路Person.prototype和Object.prototype中的所有成員
## Object.prototype的成員
* constructor :指向和該原型相關的構造函數
* hasOwnProperty 方法: 判斷對象本身是否擁有某個屬性
* properIsEnumerable 方法: 1.判斷屬性是否屬于對象本身,2.判斷屬性是否可以被周遊
* toString toLocaleString: 将對象轉換成字元串toLocalString轉換成字元串的時候應用的本地的設定格式
//3.isPrototypeOf 方法 判斷對象1是不是對象2的原型 |
//對象1.isPrototypeOf(對象2) |
// function Person(){ |
// |
// } |
// |
// var p = new Person(); |
// var o ={}; |
// console.log(o.isPrototypeOf(p)); |
* valueOf 方法:在對象參與運算的時候,首先調用valueOf方法擷取對象的值,如果該值無法參與運算,将會調用toString方法
* __proto__ 屬性: 指向目前對象的原型對象
## Function
### 3種建立函數的方式
*直接聲明函數
*函數表達式
*new Function()
可以用Function來建立函數:
文法:
```js
var 函數名 = newFunction(); //建立一個空的函數
var 函數名 = newFunction("函數體") //建立一個沒有參數的函數
var 函數名 = newFunction("參數1","參數2", "參數3",..."函數體")
//當給Fucntion傳多個參數的時候,最後一個參數為函數體,前面的參數為建立出來的函數的形參
//Function接收的所有的參數都是字元串類型的!!!
```
## arguments對象(僞數組)
arguments對象是函數内部的一個對象,在函數調用的時候,系統會預設的将所有傳入的實參存入該對象
//arguments.length 可以用來表示傳入實參的個數(用于判斷傳參的個數)
//arguments.callee 指向函數本身
注意:不管有沒有形參,實參都會被存入該對象
## eval
可以将字元串轉換成js代碼并執行
注意:當使用eval解析JSON格式字元串的時候,要注意,會将{}解析為代碼段
1.可以在JSON格式字元串前面拼接"var 變量名 ="
eval("var 變量名 =" + JSON格式的字元串);
2.可以在JSON格式字元串前後拼接()
eval("("+JSON格式的字元串+")"
//3.Function和eval有什麼差別
//共同點,都可以将字元串轉換成js代碼
//不通點
//1.Function 建立出來的是 函數 并不會直接調用,隻有當手動去調用建立出來的函數的時候,才會執行
//2.eval 把字元串轉成代碼之後,直接就執行了
## 靜态成員和執行個體成員
###靜态成員
通過構造函數去通路的屬性和方法就是靜态成員
//Person.成員
###執行個體成員
通過對象(執行個體)去通路的屬性和方法就是執行個體成員
//varp = new Person(); p.成員
若有不足請多多指教!希望給您帶來幫助!