详解Javascript中new()到底做了些什么?

 更新时间:2018年03月29日 10:24:41   作者:一直在寻  
javascript中,new操作符的工作原理是什么?它是怎样改变构造函数的返回值和this指向的?下面这篇文章就来给大家介绍了关于Javascript中new()到底做了些什么的相关资料,需要的朋友可以参考下。

前言

和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象。 但在 javascript 中,万物皆对象,为什么还要通过 new 来产生对象? 本文将带你一起来探索 javascript 中 new 的奥秘...

要创建 Person 的新实例,必须使用 new 操作符。

以这种方式调用构造函数实际上会经历以下 4个步骤:

(1) 创建一个新对象;

(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;

(3) 执行构造函数中的代码(为这个新对象添加属性) ;

(4) 返回新对象。

 new 操作符

在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在JavaScript中,我们将这类方式成为Pseudoclassical。

基于上面的例子,我们执行如下代码

var obj = new Base();

这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是:


new操作符具体干了什么呢?其实很简单,就干了三件事情。

var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一行,我们创建了一个空对象obj

第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象

第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法。

如果我们给Base.prototype的对象添加一些函数会有什么效果呢?

例如代码如下:

Base.prototype.toString = function() {
 return this.id;
}

那么当我们使用new创建一个新对象的时候,根据__proto__的特性,toString这个方法也可以做新对象的方法被访问到。于是我们看到了:

构造子中,我们来设置‘类'的成员变量(例如:例子中的id),构造子对象prototype中我们来设置‘类'的公共方法。于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化的效果。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Js动态添加复选框Checkbox的实例方法

    Js动态添加复选框Checkbox的实例方法

    Js动态添加复选框Checkbox的实例方法,需要的朋友可以参考一下
    2013-04-04
  • 微信小程序实现单个或多个倒计时功能

    微信小程序实现单个或多个倒计时功能

    这篇文章主要为大家详细介绍了微信小程序实现单个或多个倒计时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 教你如何通过JavaScript读取元素的样式

    教你如何通过JavaScript读取元素的样式

    这篇文章主要给大家介绍了关于如何通过JavaScript读取元素的样式,文中通过实例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • js对象数组查找某一元素的各种方法(不改变原数组)

    js对象数组查找某一元素的各种方法(不改变原数组)

    前端经常要通过javaScript来处理数组中的数据,其中就包括检查数组中是否包含满足特定搜索条件的单个或者多个值,这篇文章主要给大家介绍了关于js对象数组查找某一元素的各种方法,文中介绍的方法不改变原数组,需要的朋友可以参考下
    2024-06-06
  • 原生js实现购物车

    原生js实现购物车

    这篇文章主要为大家详细介绍了原生js实现购物车,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 分享javascript、jquery实用代码段

    分享javascript、jquery实用代码段

    这篇文章主要为大家分享了javascript、jquery实用代码段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 如何判断出一个js对象是否一个dom对象

    如何判断出一个js对象是否一个dom对象

    如何判断出一个js对象是否一个dom对象呢?下面小编就为大家带来一篇判断出一个js对象是否一个dom对象的方法。希望对大家有所帮助。一起跟随小编过来看看吧
    2016-11-11
  • js实现移动端吸顶效果

    js实现移动端吸顶效果

    这篇文章主要为大家详细介绍了js实现移动端吸顶效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • MyEclipse取消验证Js的两种方法

    MyEclipse取消验证Js的两种方法

    通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下
    2013-11-11
  • 将页面table内容与样式另存成excel文件的方法

    将页面table内容与样式另存成excel文件的方法

    本文分析一下将页面table内容与样式另存成excel文件的方法,主要介绍style与class之间的区别问题。
    2015-08-08

最新评论