js高级02--js特性+原型链+原型链继承+原型对象(成员)+Function+arguments

继承


构造函数.prototype的成员:


//Function函数所有的参数全都是字符串(初始化)
//Function函数的作用就是将所有的参数组合起来,变成一个函数


arguments对象

在每一个函数调用的过程中, 函数代码体内有一个默认的对象arguments, 它存储着实际传入的所有参数。

arguments是一个伪数组对象. 它表示在函数调用的过程中传入的所有参数的集合。在函数调用过程中不规定参数的个数与类型, 可以使得函数调用变得非常灵活性。

JavaScript中的函数并没有规定必须如何传参:

1.     定义函数的时候不写参数, 一样可以调用时传递参数

2.     定义的时候写了参数, 调用的时候可以不传参

3.     定义的时候写了一个参数, 调用的时候可以随意的传递多个而参数

在代码设计中, 如果需要函数带有任意个参数的时候, 一般就不带任何参数, 所有的参数利用arguments对象来获取. 一般的函数定义语法, 可以写成:

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

## 继承

### 混入式继承

   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.Functioneval有什么区别
//共同点,都可以将字符串转换成js代码
//不通点
    //1.Function 创建出来的是 函数 并不会直接调用,只有当手动去调用创建出来的函数的时候,才会执行
    //2.eval 把字符串转成代码之后,直接就执行了

## 静态成员和实例成员

###静态成员

    通过构造函数去访问的属性和方法就是静态成员

//Person.成员

###实例成员

    通过对象(实例)去访问的属性和方法就是实例成员

//varp = new Person(); p.成员



若有不足请多多指教!希望给您带来帮助!

猜你喜欢

转载自blog.csdn.net/muzidigbig/article/details/80824243