原文链接:https://blog.csdn.net/u012468376/article/details/53121081

一、什么是原型
原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。

1.1 函数的原型对象
​ 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象B就是函数A的原型对象,简称函数的原型。这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:constructor属性的值是函数A )。

1.2 使用构造函数创建对象
​ 当把一个函数作为构造函数 (理论上任何函数都可以作为构造函数) 使用new创建对象的时候,那么这个对象就会存在一个默认的不可见的属性,来指向了构造函数的原型对象。 这个不可见的属性我们一般用 [[prototype]] 来表示,只是这个属性没有办法直接访问到。

​ 看下面的代码:

1、从上面的图示中可以看到,创建p1对象虽然使用的是Person构造函数,但是对象创建出来之后,这个p1对象其实已经与Person构造函数没有任何关系了,p1对象的[[ prototype ]]属性指向的是Person构造函数的原型对象。

2、 如果使用new Person()创建多个对象,则多个对象都会同时指向Person构造函数的原型对象。

3、 我们可以手动给这个原型对象添加属性和方法,那么p1,p2,p3…这些对象就会共享这些在原型中添加的属性和方法。

4、 如果我们访问p1中的一个属性name,如果在p1对象中找到,则直接返回。如果p1对象中没有找到,则直接去p1对象的[[prototype]]属性指向的原型对象中查找,如果查找到  则返回。(如果原型中也没有找到,则继续向上找原型的原型—原型链。 后面再讲)。

5、 如果通过p1对象添加了一个属性name,则p1对象来说就屏蔽了原型中的属性name。 换句话说:在p1中就没有办法访问到原型的属性name了。

6、 通过p1对象只能读取原型中的属性name的值,而不能修改原型中的属性name的值。 p1.name = “李四”; 并不是修改了原型中的值,而是在p1对象中给添加了一个属性name。

二、与原型有关的几个属性和方法
2.1 prototype属性
​ prototype 存在于构造函数中 (其实任意函数中都有,只是不是构造函数的时候prototype我们不关注而已) ,他指向了这个构造函数的原型对象。

​ 参考前面的示意图。

2.2 constructor属性
​ constructor属性存在于原型对象中,他指向了构造函数

看下面的代码:

四、动态原型模式创建对象

说明:

  • 组合模式和动态原型模式是JavaScript中使用比较多的两种创建对象的方式。
  • 建议以后使用动态原型模式。他解决了组合模式的封装不彻底的缺点。
 

最新文章

  1. TCP同步与异步,长连接与短连接【转载】
  2. 文件夹锁定(Source)
  3. ConCurrent in Practice小记 (1)
  4. Ladda – 把加载提示效果集成到按钮中,提升用户体验
  5. MySql练习+加源代码
  6. PHP版本区别
  7. Timer与ScheduledThreadPoolExecutor的比较
  8. SpringMvc中Interceptor拦截器用法
  9. js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
  10. uboot在s3c2440上的移植(2)
  11. Java 文件下载
  12. 泛型Binary Search Tree实现,And和STL map比较的经营业绩
  13. 基于类(Java)和基于原理(JavaScript)的对象系统的比较
  14. sed武功心法(info sed翻译+注解)
  15. 二阶环路滤波器的matlab 设计
  16. python(一)——初识与变量
  17. 面试题---实现strcpy函数
  18. repr方法字符串输出实例对象的值
  19. vue 之 Vue.extend()
  20. node集成mysql——pool连接池

热门文章

  1. kotlin标准委托之可观察属性
  2. OpenStack Manila发展动态系列--Austin峰会
  3. iOS自定义下拉列表
  4. iOS——归档对象的创建,数据写入与读取
  5. 【VS开发】图像颜色
  6. Matlab JPEG详细介绍
  7. Mysql批量插入返回Id错乱(原因分析)
  8. 2019icpc-徐州网络赛
  9. #论文阅读# Universial language model fine-tuing for text classification
  10. 【AtCoder】ARC058