原型与原型链

原型

1.原型的定义:原型是function对象的一个属性,它定义了构造函数制造出来的对象的公共祖先。经过该构造函数产生的对象,能够继承该原型的属性和方法。原型也是对象函数

咱们先定义一个构造函数,Person.prototype这个属性就是这个构造函数的原型,这个属性是天生就有的,而且这个属性的值也是一个对象。测试

咱们能够在prototype上面添加属性和方法,每个构造出来的对象均可以继承这些属性和方法。this

虽然每个对象都是独立的,可是他们都有共同的祖先,当咱们访问这个对象的属性的时候,若是它没有这个属性,就会向上找到它的原型,而后在原型上访问这个属性。spa

这里咱们oPerson对象由于自身有一个money属性,因此就不会到原型上去寻找money属性,而是查询自身的money属性,所以打印的是100,可是当咱们删除了自身的money属性以后,它就会到原型上去寻找money这个属性,所以就打印200。prototype

当咱们再次给对象添加属性以后,打印money属性就是自身的属性。3d

2.利用原型特色和概念,能够提取公有属性对象

咱们能够把每个对象都有的公有属性不写在构造函数里面,而是提取到原型上,这样当咱们用构造函数构造大量的对象的时候就不须要走屡次构造函数里面的赋值语句了,而只须要走一遍,每个对象调用属性的时候直接上原型上查找就能够了。blog

3.对象如何查看原型继承

前面咱们提到了构造函数能够经过.prototype的方法来查看构造函数的原型,那么咱们怎么查看对象的原型呢?原型链

咱们前面提到过用构造函数构造对象的时候,会隐式建立一个this对象,这个this对象里面有一个默认的属性叫作proto属性,这个属性的值就是指向的这个对象的原型。

当查找的属性是自身没有的属性的时候,就会先查找proto这个属性,而后这个属性指向了原型,因此就到原型上面继续查找属性了。

注意:prototype是函数的属性,proto是对象的属性

4.对象如何查看构造自身的构造函数

在prototype里面,有一个隐式的属性叫作constructor,这个属性记录的就是对象的构造器,里面存的就是构造函数。

console.log(oPerson.constructor); // Person();

 

原型链

有了原型,原型仍是一个对象,那么这个名为原型的对象天然还有本身的原型,这样的原型上还有原型的结构就构成了原型链。

Foo创造出来的每个对象都继承自grandfoo这个对象,son的每个对象都继承自father这个由Foo创造出来的对象,这样son就能够继承上面Foo和Gra的全部属性。

当咱们查找son上的属性的时候,若是son自身有属性,那么就打印出来,若是没有,就向上查找原型father,若是father上面还有这个属性,那么继续向上查找grandfoo,若是有就输出,若是没有就返回undefined。

这种链式的查询结构就叫作原型链。

那么原型链有没有终点?咱们写的Gra是否是这个原型链的终点?

有测试能够看出,其实咱们的Gra.prototype上面还有原型,这个原型是一个空对象,这个空对象上面就没有了。

其实,绝大部分的对象最终都会继承自Object.prototype这个对象。

咱们没有规定原型的对象,它们的原型就是Object.prototype

因而可知,原型链的终点通常是Object.prototype;

可是并非全部的对象都有原型

咱们上一篇提到过第三种构造对象的方法,使用Object.create方法。

Object.create()方法须要写一个参数,这个参数就是咱们这个对象的原型。若是咱们想要构造和var obj = {};同样的空对象,那么就须要写:

固然,咱们也能够写一个自定义的属性,让它成为原型。

可是,当咱们写参数为null的时候,咱们就构造出来了一个没有原型的对象

undefined null也都没有原型。它们之因此能打印出来,是由于不调用任何方法的,直接打印出来。

 

原型链上属性的增删改查

其实咱们前面一直在使用着这些方法,这里说一下原型上的引用值。当咱们经过一个对象改变了原型上的引用值类型的属性的话,那么全部对象的这个属性的值都会随之更改。

删除

这个时候person对象上面没有了name属性,那么依据咱们前面说的当自身没有这个属性的时候就会向原型查询这个属性的说法,咱们再次删除这个属性是否是就能够删除原型上的属性了?

然而事实并无,因而可知,对象并不能删除原型上的属性

这里提一下这个this的指向。谁调用这个方法,这个方法中的this就指向这个调用它的对象

因此这里的this指向的是oPerson这个对象,这个对象的name属性值是son。

那么今天的知识点就介绍到这里哟~

相关文章
相关标签/搜索