原型的概念
- 实例对象中__proto__是原型,是一个属性也是一个对象,是给浏览器使用的,是不标准的,这个叫隐式原型。
- 构造函数中的prototype是原型,是一个属性也是一个对象,是给程序员用的,是标准的
__proto__原型是浏览器使用的,有些浏览器支持,有些浏览器不支持,所以说它是不标准的;而prototype原型则是给程序员用的,所有浏览器都支持;所有我们说的原型一般都指prototype
原型链
原型链:是一种关系,实例对象和原型对象之间的关系,关系是通过原型(__proto__)来联系的
原型的作用
凡是你希望这个方法通过实例对象调用的并且希望共享的,那么这个方法都可以放在原型里面,而不需要共享的数据则写在构造函数中
当有多个属性和方法需要被同时共享时,这时可以将原型对象拿出来写成一个对象,不过此时需要自己手动修改构造器的指向
如果想要使用一些属性和方法,并且属性的值在每个对象中都是一样的,方法在每个对象中的操作也都是一样,那么,为了共享数据,节省内存空间,是可以把属性和方法通过原型的方式进行赋值
原型中的方法是可以被相互调用的
实例对象调用属性和方法时,现在实例对象中查找,找到了直接用,找不到则去实例对象的__proto__指向的构造函数的原型对象prototype中找,找到直接调用,属性找不到为undefined,方法找不到则报错
构造函数、原型对象、实例对象之间的关系
- 构造函数可以实例化对象
- 构造函数中有一个属性叫prototype,是构造函数的原型对象
- 构造函数的原型对象(prototype)中有一个constructor构造器,这个构造器指向的就是自己所在的原型对象所在的构造函数
- 实例对象的原型对象(__proto__)指向的是该构造函数的原型对象
- 构造函数的原型对象(prototype)中的方法是可以被实例对象直接访问的
改变原型指向
实例对象的原型__proto__指向的是该对象所在的构造函数的原型对象
构造函数的原型对象(prototype)指向如果改变了,实例对象的原型(__proto__)指向也会发生改变
此时若要调用Student通过原型定义的属性和方法则需要定义在改变指向的下面,这样Student的实例对象才能调用
通过原型实现继承
继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承
继承也是为了数据共享,js中的继承也是为了实现数据共享
为了数据共享,改变原型指向,做到了继承,不过因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的了,只能重新调用对象的属性进行重新赋值。此时需要结合借用构造函数形成组合继承,完成完整的继承
借用构造函数:构造函数名字.call(当前对象,属性,属性,属性....);