js实例化以及constructor探究

先来一个构造函数:

function Person(name){
    this.name=name;
}

对其添加原型链:

Person.prototype={
getName:function(){

return this.name;

}
}

对其实例化:

var person=new Person('xiaopu');

这样完成一个基本的构造函数加原型链的组合封装。

我们不去探究原型链的过程 这个可以参考前边的文章

我们来主要研究一下实例化过程,以及实例化前后constructor的指向问题:

实例化过程:

实例化其实是一个new的过程,在这里将其分为四步去执行

1.实例一个object对象

2.将构造函数的作用域置入该object

3.将构造函数赋值到object

4.执行object代码

在这个过程中 首先是实例化一个object,所以新的实例person实际是通过Object继承而来的。

也就是说person instanceof Object==person instanceof Person==true

constructor指向:

每个构造函数都有一个prototype属性,这个属性指针指向的是一个object,

每个对象都有一个constructor指针,这个指针指向的是创建该对象实例的构造函数。

当然函数也是对象也会有constructor属性例如Person.constructor就指向了Function,因为Function是它的构造函数,也就是说Person是Function的实例。

1.

上面代码我们重写如下:

function Person(name){

this.name=name;

}

var person=new Person('xiapu');

此时Person.prototype是一个空对象,

而person.constructor指向的是Person,Person.prototype.constructor指向的也是Person

2.

当我们显示的对构造函数进行原型扩展后

Person.prototype={
getName:function(){return this.name}

}

这个时候person.constructor以及Person.prototype.constructor都指向的是Object而不是Person

究其原因,是因为一个新对象赋值给了Person.prototype,此时的Person.prototype是一个object的实例。

这个object的constructor指向的肯定就是object的构造函数类Object,所以二者的constructor都会指向Object

如果constructor对于你的判断很重要 可以在原型中添加constructor并将其赋值为Person

Person.prototype={
constructor:Person,

getName:function(){return this.name}
}

3.

而如果以Person.prototype.getName=function(){return this.name}去定义原型对象,

此时的constructor就不存在新建一个object过程,那么二者的指向依然会是Person

但是如果一开始用对象方式声明prototype然后又用原型链去声明原型属性 那么此时二者的constructor依然指向的是Object,因为对象方式声明的prototype已经覆盖了原先构造函数中存在的原型链。

即:Person.prototype={};

Person.prototype.getName=function(){return this.name}

js实例化以及constructor探究相关推荐

  1. 【推荐】关于JS中的constructor与prototype【转】

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  2. 关于JS中的constructor与prototype

    在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们 ...

  3. js设计模式之Constructor(构造器)

    说明:最近正在看Addy Osmani写的<JavaScript设计模式>这本书,故记一下读书笔记与大家分享.本文的内容基本上都出自那本书,如果觉得不错可以去买一本看看. 9.1Const ...

  4. [转载]Node.js模块化机制原理探究

    转载地址:https://segmentfault.com/a/1190000008371376 前言 Node应用是由模块组成的,Node遵循了CommonJS的模块规范,来隔离每个模块的作用域,使 ...

  5. Node.js模块化机制原理探究

    前言 Node应用是由模块组成的,Node遵循了CommonJS的模块规范,来隔离每个模块的作用域,使每个模块在它自身的命名空间中执行. CommonJS规范的主要内容: 模块必须通过 module. ...

  6. bilibili视频下载 (node.js)

    前言 SESSDATA 后面的 ; 分号必需写上,否则请求失败或报错. 后面的实现主要是练习下 js 的特性,使用时看接口就好. node的控制台刷新显示不清楚,将就下默认的计时器显示.这里设置了回调 ...

  7. js原生常用知识点总结

    Javascript是一个脚本语言,作为网页的行为层. js的引入方式 * 内部引入:使用script标签,在script标签中写js代码: * 外部引入:使用script的src属性,引入一个外部的 ...

  8. node mocha_如何使用Mocha和Assert测试Node.js模块

    node mocha The author selected the Open Internet/Free Speech Fund to receive a donation as part of t ...

  9. 前端复习8:JS高级

    前端复习8:JS高级 1.对象 1.1 面向过程与面向对象 1.2 对象与类 2 构造函数和原型 2.1 构造函数 2.2 构造原型prototype 2.2 对象原型 2.3 constructor ...

最新文章

  1. linux 设备树_嵌入式系统砖家_初识设备树
  2. python 内置模块:collections
  3. 创建CSS和处理的一些方法
  4. .NET Core Docker使用初入篇
  5. Python selenium 去掉“隐藏正受到自动测试软件的控制”
  6. oracle sql试题
  7. html如何修改字体黑体,css如何设置黑体样式?
  8. SpreadJS 14.1 Crack by Xacker
  9. 基于JavaWeb的订餐管理系统的设计与实现
  10. GDS List内容详情
  11. GEO,IGSO,MEO,LEO
  12. java网上课程_网上免费的课程能学会Java吗?
  13. Excel-快速填充
  14. 16丨数据分析基础篇答疑
  15. 运用大数据防控互联网金融犯罪
  16. 华为人力资源管理经典大全
  17. 如何将数据库中带有样式的数据在html页面生效
  18. Linux调整优化配置tuned
  19. Java基础面试题/知识点总结
  20. IBM笔记本驱动安装顺序

热门文章

  1. k8s源码分析 pdf_如何高效阅读 Kubernetes 源码?
  2. welearn考试切屏会有显示吗_welearn视听说教程4答案截图
  3. 视频教程-学校网管员培训视频教程-网络技术
  4. 怎样学好机器视觉,又能省钱?
  5. 苹果笔记本装win7后经常死机怎么办?
  6. 准备好了吗?蒋宝藏带你详解判别分析!
  7. ios如何介入苹果广告_苹果公司的iOS 14广告股票面临新的重大挑战
  8. 将4G以上文件从iphone传到电脑中的方法
  9. 爱普生l360扫描仪显示无法连接计算机,爱普生扫描仪打不开出现这个错误请问怎么解决阿...
  10. python项目实战——银行取款机系统(六)