对于原型的理解
什么是原型呢,首先我们要知道除了Object.creat(null)创建的对象没有原型以外,我们的空对象,空数组都有原型.在JavaScrip当中原型是一个prototype对象,用来表示类型之间的关系. 与原型联系最密切的就是构造函数,每个构造函数的内部都有一个prototype属性,它的属性值是一个对象,这个对象由该构造函数所有实例可以共享的属性和方法组成. 当我们使用该构造函数新建一个对象的时候,这个对象内部将包含一个指针,这个指针指向构造函数的prototype属性所对应的值,在es5当中这个指针被称为对象的原型. 在es5当中新增了一个Object.getPrototypeOf()方法,在我们平常可以通过该方法来获取对象的原型,虽然在浏览器当中都实现了__proto__属性,但是它不是规范当中规定的,所以尽量要避免使用
原型链
每当我们访问一个对象的属性的时候,如果该对象内部不存在该属性,那么它就会去它原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念. 原型链的尽头一般来说都是Object.prototype所以这就是为什么新建的对象能够使用toString()等方法的原因
特点 : JavaScrip对象是通过引用来传递的的,创建的每个新对象实体中并没有一份属于自己的原型副本.当修改原型时,与之相关的对象也会继承这一改变
原型修改和重写
在这里面我们可以看到,在我们修改了原型的时候,person的构造函数就不是再指向Person了,因为直接给Person的原型对象直接用对象赋值时候,它的构造函数就指向了根构造函数Object,所以这个时候person.constructor === Object, 而不是person.constructor === Person. 如果想要该效果成立,就需要用constructor指回来.
原型链的指向
\
原型链的终点是什么? 如何打印出原型链的终点?
由于Object是构造函数,原型链的终点是Object.prototype.__proto__,而Object.prototype.__proto__ === null // true ,所以,原型链的终点是null.原型链上的所有原型都是对象,所有对象最终都是由Object构造的,而Object.prototype的下一级是``Object.prototype.proto`