1,定义:原型是function对象的一个属性,它定义了构造函数制造出对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
原型就相等于构造函数所要构造的对象的父亲,比如上面person里虽然是空的,但是可以访问name属性,这就是一种继承、
可以访问原型中的对象,也可以访问自己的对象
原型的作用:
利用原型的特点和概念,可以提取共有属性,减少代码重复执行
原型的增删改查:
查看:直接点就好
改:
发现person对象中增加了lastName属性,返回的也是person中的lastName属性。
所以,你只能像下面那样写:
增加:
删:
切记:
这是删不掉的,系统会认为你是在删除一个没有的元素,所以才会返回true,如下
原型还可以用下面这种表示方法
--------------------------------------------------------------------------------------------------------
发现键入了person.constructor之后返回了person的构造函数,(constructor会返回构造这个对象的构造函数)
Person.prototype.constructor暂时没有什么用
那么,这个constructor是从哪里来的?我们自己没有设置,看下面:
那么,我们现在更改constructor
发现也会更改
-----------------------------------------------------------------------------------------------------------------
我们最开始把name:abc保存到了原型里面,现在在proto里面找到了name : abc,所以proto就是用来保存原型的
在说构造函数构造对象时的三段式:
先建立一个空的this对象,
然后执行this.xxx = xxx;
最后返回this,
其实最先创造的this对象并不是空的,里面就有: __proto__ : Person.prototype,它起到一个连接的作用,如果在自己的对象空间中没有找到对应的元素就回沿着__proto__的值去查找,即到原型中查找
再看下面:
我们改变proto之后就会发现person.name值也进行更改了
三段式(new触发)第一段建立一个this对象,内部__proto__指向这个时候的Person.prototype,然后接下来Person.prototype改变了自己的内容,但是这个时候他是通过重新申请一个空间来改变的,同时__proto__的指向并没有发生变化,所以还是sunny(原理就是原始值和引用值)
就和下面一样
这个是由于在new 执行的时候才会有this对象出来