前言
网上常见的关于原型原型链的八股,都太过常规和笼统,如果直接背下去,没什么区分度,本文结合个人对原型原型链的理解和思考,写下的逐字稿,更有逻辑性和区分度,有需要的兄弟可以参考参考 既然说到原型对象原型链,首先得说一下对象是如何被创建出来的?
正文
正常我们创建对象有两种方法,第一种就是直接采用对象字面量来创建,第二种就是new Object,用对象字面量来创建其实是new Object的语法糖。Object看作是一个构造函数。
每个对象内部都有一个属性,也可以说是一个指针,这个指针指向了一个对象,而这个对象就是所谓的对象原型,在一些浏览器内部实现了__proto__属性,来访问这个对象原型,但是因为他不是规范中规定了,所以建议别在开发中使用,es5中新增的一个Object.getPrototypeOf()方法,可以通过这个方法来获取对象原型。
每个构造函数内部本身也有一个prototype属性,这个属性值是一个对象,这个对象包含了可以由该构造函数实例共享的属性和方法。
那二者的关系是由new操作符来进行链接
在构造函数被new关键字调用的时候,就会发生以下操作,一,在内存中创建一个新的空对象,二,对象内部的__proto__属性值就会被赋值成构造函数的prototype属性值,三,函数内部的this指向该对象,四,执行函数代码。五,如果函数没有返回一个非空对象,那么就将刚创建的对象返回出去。
所以对象的对象原型就等于是构造函数的prototype值,继承了他的属性和方法
接下来说一下什么是原型链
每个构造函数:例如Array都有自己的原型对象prototype,而Array每次new出来的实例对象array = new Array()如果想找一个属性和方法,而这个属性如果不在他本对象里面的话,他就需要通过对象原型__proto__往上查找到Array构造函数的prototype,重点来了,这个Array.prototype本质上来说就是一个对象,而凡是对象都是由Object构造函数new出来的,所以Array.prototype.proto=== Object.prootype,然后,以此规律,Object.Prototype.proto === null,通过这个__proto__来查找,往上查找对象原型属性的链式结构,就叫做原型链
结尾
如有错误,欢迎各位批评指正,共同进步!