原型
Javascript规定,每一个函数都有一个prototype对象属性,指向另一个对象(原型链上面的)。
prototype(对象属性)的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变(公用)的属性和方法,直接定义在prototype对象属性上。
prototype就是调用构造函数所创建的那个实例对象的原型(proto)。
prototype可以让所有对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。
原型链
1.每个对象都可以有一个_proto(原型指针)_,这个原型还可以有它自己的原型,以此类推,形成一个原型链
2.查找属性(方法)
先查找对象本身是否存在该属性,如果本身没有,则会去__proto__中查找,(也就是构造函数的显式原型中查找),如果构造函数中也没有该属性,因为构造函数也是对象,也有__proto__,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined。null没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null。
__proto__和prototype的关系
__proto__是一个指针,指向构造函数的原型对象prototype(实例对象的__proto__指向的是构造函数的prototype)