1)构造函数的弊端:
方法功能相同,但是却存在不同的内存空间中。
这样浪费了内存空间。没有必要。
2)原型:
每一个函数都有一个prototype属性,该属性指向了一个原型对象。
原型对象是用来存放共有的属性和方法。
默认情况下,
所有原型对象会自动包含一个constructor属性,该属性也是一个指针,
指向prototype所在的函数(构造函数):
用构造函数创建新的实例时,该实例的内部会自动包含一个[[Prototype]]属性,指向构造函数的原型对象。
这个属性的访问方式 : 对象名 . __proto__
TIPs:
实际开发中,构造函数和原型对象一般会结合使用,
可以灵活的控制对象的数据共享与不共享。
需要共享的属性和方法就放到----原型对象中,
不需要共享的属性和方法就放到----对象或构造函数中。
3)原型链:
因为任何一个对象都有[[prototype]]属性,原型对象也是对象,也有[[prototype]]属性.
这样形成了一条原型链。最终指向的是Object构造函数的原型对象。
Object构造函数的原型对象的原型对象是null
访问一个对象的属性或方法,如果该对象本身没有,就会沿着这条原型链一直查询,
找到了就拿来使用。找不到就报错。