面向对象的深入理解

JS中有很多的内置类:
> Number、String、Boolean、[Null、Undefined]、Object、Function、Array、RegExp、Date…
>
> 每一个数字类型的值都是Number的实例,可以调取Number原型上提供的方法
> …
> 每一对象数据类型都是Object的实例,都可以调取Object.prototype上提供的方法(内置方法:toString、hasOwnProperty…,也可以自己在原型上扩展自定义的方法,这些方法我们的对象也可以使用)
> …
> 每一个函数都是Function的实例,可以调用Function.prototype上的方法(call、apply、bind…)
>
>
> 哪些是函数?哪些是对象类型的值?
> [函数]
> 普通函数、类(内置类、自己创建的类)
>
> [对象]
> {}普通对象、[]数组、/^$/正则、new Date创造的日期
> Math、JSON… 这些在window中提供的对象
> 类数组也是对象
>
> 汇总:
> 所有类的实例都是对象类型的(特殊:使用字面量方式创建的基本数据类型不是对象)
> 一些常用的对象方法(例如:Math是个对象,里面提供很多操作数字的方法…)
> xxx.prototype 以及 xxx._proto_
> 函数也是对象
> …
> 万物皆对象

函数的角色
> 1、函数:普通函数、构造函数(类)
> 2、对象
```javascript
function fn(){}
/*
* fn();//=>普通函数
* new fn();//=>构造函数,fn是类
*/
//=> fn instanceof Function =>TRUE(说明它是个函数)
//=> fn instanceof Object =>TRUE(说明它也是一个对象)

//=>fn的结构
dir(fn)
[把其作为对象,内置的私有属性]
name:’fn’ 函数名
length:0 形参的个数

prototype:… fn作为类的时候,可以把一些公用的属性和方法写在原型上,供它的实例调用

proto:Function.prototype 它作为一个普通函数,它是Function的实例,所以会指向Function的原型
[公有的属性和方法]
constructor:Function
call
apply
bind

proto:Object.prototype fn的原型链上有Object.prototype,也说明fn其实也是一个对象(但是它是Function的直属实例,两种角色中还是要以函数这个角色为主的)
toString
hasOwnProperty

proto:null