一. 创建对象
原型链创建对象有 三种 主要的形式
第三种方式详解:
p是一个对象,将p作为参数放入object.create()中。
生成一个o3对象即o3的 _ ptoto _指向的就是p。也就是说p是o3的原型对象。
即Object.create方法是把参数中的对象作为一个新对象的原型对象赋给o3,o3本身没有需要的属性,是通过原型链获得
混合方式最好
二. 原型(对象)、构造函数、对象、原型链的定义
- 实例:
- 构造函数:
只要用new去操作,就是构造函数
构造函数的变量名首字母一定要大写!!
1 - 2. New 构造函数通过New来创建一个实例
- 原型: 每个对象在其内部初始化一个属性。函数通过prototype属性初始化的一个空对象
2 - 3. prototype 函数都有prototype属性,会为初始化一个空对象,即原型对象
3 - 2. constructor 构造器 原型对象通过constructor区分自己是被那个构造函数所引用
构造器会默认声明的函数
1- 3 _ proto _
实例的_ proto _ 其实就是指 其自己的构造函数的prototype
原型链:
如果当前对象内不存在需要的属性和方法,就会去这个对象的prototype里去找,原型对象又有自己的_ proto 和prototype.所以如果这个对象的prototype仍未找到该属性或方法,就会继续向上找。一直到找到或者返回null
【object.prototype是顶端】
原型链基本原理:
任何一个实例对象通过原型链找到其上面的原型对象,那上面的方法和属性都是被实例所共享,即被不同实例所共用
优:
原型对象:一次性给一堆对象添加属性和方法的对象
可以共用原型对象的属性和方法
o3和o5均有say这个方法
只有函数才有prototype
==只有对象才有 proto _==【函数也是对象】
三. New
第一步:创建一个新对象,这个对象是继承了该构造函数的原型对象
【此时是新建了一个空对象,还没生成实例对象】
第二步:会把新创建的空对象与this相关联,【如果没有办法把这个构造函数的上下文转到新实例上的话,最后返回的对象没法相关联】
第三步:要不要返回这个新建的对象呢?–> 有返回对象就返回,否则就返回生成的新对象
整个工作原理
四. instanceOf
原理
判断实例对象是不是这个构造函数的实例时,其实判断的是实例对象的 _ proto _ 属性 和 构造函数的 prototype属性是不是引用的同一个地址
原型对象也会向上有自己的 _ proto _属性和构造函数,但只要是在这条链上的,都会返回true
因为
所以不能轻易的说o3是Object的实例。【因为o3原本应该是M的实例,只不过M.prototype.proto _ 就等于 object.prototype.也就是说object也在这条链上】
所以要用constructer来判断是否是其实例
所以用 constructer判断实例对象从严谨意义上说比instanceof更好
实例对象的 proto _ 实际上引用的是原型对象,与实例的构造函数没多大关联