天天看點

js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments

繼承

js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments

構造函數.prototype的成員:

js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
//Function函數所有的參數全都是字元串(初始化)
           
//Function函數的作用就是将所有的參數組合起來,變成一個函數
           
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments

arguments對象

在每一個函數調用的過程中, 函數代碼體内有一個預設的對象

arguments

, 它存儲着實際傳入的所有參數。

arguments

是一個僞數組對象. 它表示在函數調用的過程中傳入的所有參數的集合。在函數調用過程中不規定參數的個數與類型, 可以使得函數調用變得非常靈活性。

JavaScript中的函數并沒有規定必須如何傳參:

1.     定義函數的時候不寫參數, 一樣可以調用時傳遞參數

2.     定義的時候寫了參數, 調用的時候可以不傳參

3.     定義的時候寫了一個參數, 調用的時候可以随意的傳遞多個而參數

在代碼設計中, 如果需要函數帶有任意個參數的時候, 一般就不帶任何參數, 所有的參數利用

arguments

對象來擷取. 一般的函數定義文法, 可以寫成:

function foo (/* ... */)         {}
           

callee指代正在運作這個函數的自身(目前運作的函數)

js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments
js進階02--js特性+原型鍊+原型鍊繼承+原型對象(成員)+Function+arguments

## 繼承

### 混入式繼承

   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.成員

若有不足請多多指教!希望給您帶來幫助!

繼續閱讀