1.静态变量和函数
- 当定义一个函数后通过“.”为其添加的属性和函数,通过对象本身依然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数;反之称为实例变量和函数
2.原型
- 每个对象都有一个内部属性prototype,我们称之为原型。
- 原型的值可以是一个对象,也可以是null。
- 如果它的值是一个对象,则这个对象也有自己的原型,于是形成了原型链。
- 使用原型的好处是可以让对象实例共享它所包含的属性和方法。
- 当调用构造函数创建一个实例的时候,实例内部将包含一个内部指针(_proto_)指向构造函数的prototype。
- Function是一个函数对象,但它有点特殊,它的原型就是一个function空函数。
- Array也是一个函数对象,它的原型就是Array.prototype。
3.原型链
- 当从一个对象那里调取属性或方法时,如果该对象自身不存在这样的属性或方法,就会去自己关联的prototype对象那里寻找,如果prototype没有,就会去prototype关联的父级prototype那里寻找,如果再没有则继续查找Prototype.Prototype引用的对象,依次类推,直到Prototype为undefined(Object的Prototype就是undefined)从而形成了所谓的“原型链”。
4.constructor
- 原型对象prototype中都有个预定义的constructor属性,用来引用它的函数对象
5._proto_属性和prototype属性的区别
- prototype是function对象中专有的属性。
- _proto_是普通对象的隐式属性,在new的时候,会指向prototype所指的对象。
- _ptoto_实际上是某个实体对象的属性,而prototype则是属于构造函数的属性。
6.总结
- 所有的对象都有_proto_属性,该属性对应该对象的原型。
- 所有的函数对象都有prototype属性,该属性的值会被赋值给该函数创建的对象的_proto_属性。
- 所有的原型对象都有constructor属性,指向该原型的实例构造函数。
- 函数对象和原型对象通过prototype和constructor属性进行相互关联。
- 函数都继承于Function函数,对象都继承于Object对象。
- 函数Function也是对象Object,Object也有自己的构造函数Function,所以Function和Object是互相创造的。
- 原型链的形成是真正是靠_proto_ 而非prototype。