首先要明确一点,js中的prototype是每个函数创建时(并非执行时,而是函数存在于堆区后)自动创建一个默认对象,这一对象中可以动态的添加属性

在new对象后,可以通过“对象.属性名”的方式直接调用prototype对象中的属性

但是,注意,prototype对象只在函数中存在(函数本身也是一个对象,可以具有属性/方法),通过构造函数创建的对象中不存在原型对象属性,而是存在一个指针,通常被命名为_proto_,这个并不是一个值为原型对象的属性,因此在new的对象中也无法访问。

constructor又是什么呢?

字面意思:构造器

function a(){

  this.age=12;

}

console.log(a.prototype)  // { constructor :  a() }

从打印出来的原型对象中可以看出,constrcutor是存在于原型对象中的一个属性,值为一个函数(此函数默认指向原型对象所属函数)

那么,问题来了:new是根据构造函数来创建对象,已经有了a()函数,为什么多此一举添加一个constructor属性呢?

我们打印一下constructor

console.log(a.prototype.constructor)  // a()

也就是说constructor属性值中并不存在已经得以好的a()函数已经定义好的age属性,想想也对age在new之前是属于window对象的属性,凭啥要回出现在构造函数中

实际上,new对象的过程大致是这样的:

首先编写一个函数,代码在被js引擎解析后函数存入堆区

解析到new语句时,先提取函数的prototype对象,根据原型对象中的constructor属性创建函数的对象

然后,创建new出来的对象与prototype对象的链接(在new出来的对象中添加一个指针)

最后,将a()函数中定义的属性复制一个副部给new出来的对象

最新文章

  1. 【BZOJ 1875】【SDOI 2009】HH去散步
  2. Extjs 控件属性(部分)
  3. PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例
  4. 第三章 DispatcherServlet详解
  5. Centos环境下删除Oracle11g客户端文档
  6. java创建对象的几种常用方法
  7. CURL模拟post请求上传文件
  8. jacascript 构造函数、原型对象和原型链
  9. ALL_DB_LINKS
  10. css3实现好看的边框效果
  11. SpringMVC 中模型数据处理中的@ModelAttribute 和@SessionAttributes使用细节
  12. 吴伯凡:VUCA时代的自我迭代
  13. IIS Web服务扩展中没有Asp.net 2.0
  14. Hive学习之路 (七)Hive的DDL操作
  15. [Visual Studio] .vsix项目模板制作
  16. JVM:垃圾回收机制和调优手段
  17. 以整数元素构成的list中的数字组成最小整数
  18. 【微信公众平台开发】微信JS-SDK开发,信公众平台js-sdk
  19. python常用内置函数整理
  20. C#反射第二天

热门文章

  1. js高级编程思想
  2. 利用Kubernetes(K8S)部署JAVA项目
  3. Python随笔记录之一
  4. 【转载】将本地图片转成base64
  5. mongodb与java的整合
  6. PHP数组函数实现栈与队列的方法介绍(代码示例)
  7. spring的 onApplicationEvent方法被执行两次问题
  8. jsp标签的介绍
  9. 【Flutter学习】之动画实现原理浅析(一)
  10. 在idea下开发出现404错误