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

yizhihongxing

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

new是Javascript中一个非常重要的关键字,它实际上是用来创建对象实例的。在使用new关键字创建对象实例的时候,new做了以下几件事情:

  1. 创建一个新的对象,并且将这个新的对象的原型链指向构造函数的原型对象。
  2. 将这个新的对象作为构造函数的上下文对象(this)来调用构造函数,并传递参数。
  3. 如果构造函数返回的值是一个对象,那么这个新的对象就会被直接返回,否则,就返回这个新的对象。

下面用一个简单实例来说明上面的过程:

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

let person1 = new Person('Tom', 18);

在上述的代码中,我们创建了一个Person的构造函数,然后使用new关键字来创建一个新的Person对象实例。

在这个过程中,new做了以下几件事情:

  1. 创建一个新的对象实例,我们可以称之为person1
  2. person1的原型链指向Person.prototype,这样person1就可以访问Person.prototype中定义的属性和方法了。
  3. Person函数作为上下文对象(this)来调用,同时传递参数'Tom'18
  4. 在构造函数中,我们将参数'Tom'18分别赋值给了person1nameage属性。
  5. 新的对象实例person1被返回,也就是说,如果我们在Person构造函数中加上return语句,那么会直接返回这个return语句所指定的对象,而不是返回person1

接下来,我们再用一个稍微复杂一些的示例来进一步说明new关键字的执行过程。在这个示例中,我们将构造函数对象和原型对象分别保存在了变量中,以便于更好地理解。

let Animal = function(name, age) {
  this.name = name;
  this.age = age;
}

let AnimalPrototype = {
  speak: function() {
    console.log(this.name + ' is speaking!');
  }
}

Animal.prototype = AnimalPrototype;

let animal1 = new Animal('Bob', 2);
let animal2 = new Animal('Mike', 4);

animal1.speak(); // Bob is speaking!
animal2.speak(); // Mike is speaking!

首先,我们定义了一个Animal构造函数,并且将它的原型链指向了一个AnimalPrototype对象。然后,我们创建了两个Animal对象实例animal1animal2,并且分别调用了它们的speak方法。

在这个示例中,new关键字做了以下几件事情:

  1. 创建一个新的对象实例,我们可以称之为animal1
  2. animal1的原型链指向AnimalPrototype对象。
  3. Animal函数作为上下文对象(this)来调用,同时传递参数'Bob'2
  4. 在构造函数中,我们将参数'Bob'2分别赋值给了animal1nameage属性。
  5. 返回新的对象实例animal1
  6. 创建一个新的对象实例,我们可以称之为animal2
  7. animal2的原型链指向AnimalPrototype对象。
  8. Animal函数作为上下文对象(this)来调用,同时传递参数'Mike'4
  9. 在构造函数中,我们将参数'Mike'4分别赋值给了animal2nameage属性。
  10. 返回新的对象实例animal2
  11. 调用animal1animal2对象的speak方法,输出相应的结果。

通过这两个示例,我们可以更好地理解new关键字的执行过程以及它所做的事情。在日常开发中,我们会经常使用new关键字来创建对象实例,因此了解new的工作原理是非常重要的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Javascript中new()到底做了些什么? - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • TabLayout+ViewPager实现切页的示例代码

    TabLayout+ViewPager实现切页的示例代码攻略 1. 添加依赖库 首先,我们需要在项目的build.gradle文件中添加TabLayout和ViewPager的依赖库。在dependencies块中添加以下代码: implementation ‘com.google.android.material:material:1.4.0’ 2. 创建…

    other 2023年8月25日
    00
  • 微信小程序 loading(加载中提示框)实例

    下面我将详细讲解“微信小程序 loading(加载中提示框)实例”的完整攻略。 1. 标准的加载中提示框实现 在微信小程序中,我们可以通过wx.showLoading()函数来实现标准的加载中提示框。具体代码如下: wx.showLoading({ title: "加载中" }); // 这里是异步操作 setTimeout(functi…

    other 2023年6月25日
    00
  • Android编程实现应用获取包名、版本号、权限等信息的方法

    Android编程实现应用获取包名、版本号、权限等信息的方法攻略 在Android编程中,我们可以使用一些方法来获取应用的包名、版本号、权限等信息。下面是一个详细的攻略,包含了两个示例说明。 获取包名 要获取应用的包名,可以使用Context对象的getPackageName()方法。以下是获取包名的示例代码: String packageName = ge…

    other 2023年8月3日
    00
  • 在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作

    在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作 在Vue CLI 3.0中,你可以使用预处理器(如Sass、Less或Stylus)来配置全局变量,以便在整个项目中共享这些变量。下面是详细的攻略: 步骤1:安装预处理器 首先,你需要确保已经安装了所需的预处理器。你可以使用以下命令来安装它们: Sass:npm …

    other 2023年7月29日
    00
  • Android 内存优化知识点梳理总结

    Android 内存优化知识点梳理总结 一、内存泄漏 内存泄漏指由于疏于释放内存而导致内存溢出的一种情况。在 Android 中,可能导致内存泄漏的场景包括: 非静态内部类引用外部类实例 Handler 引起的内存泄漏 单例模式中的 Context 引起的内存泄漏 ListView/RecyclerView 的 ViewHolder 引起的内存泄漏 Bitm…

    other 2023年6月27日
    00
  • 建模算法(十)——灰色理论之关联度分析

    建模算法(十)——灰色理论之关联度分析 在数据分析中,我们常常需要考虑某些变量之间的关联度。常用的统计学方法有相关性分析和协方差分析等。除了这些方法外,还有灰色理论中的关联度分析方法。 灰色理论简介 灰色理论是由中国科学家邓聚龙于1982年发明的,是一种针对非线性、不确定、小样本的数据建模方法。其基本思想是将系统的发展过程分为发展阶段和中间灰色区域,利用灰色…

    其他 2023年3月28日
    00
  • 如何测试局域网的网速及数据吞吐量

    以下是测试局域网的网速及数据吞吐量的完整攻略: 使用iperf工具进行带宽测试: 安装iperf工具:在测试机和目标机上都安装iperf工具。 启动iperf服务器:在目标机上运行以下命令启动iperf服务器: iperf -s 运行iperf客户端:在测试机上运行以下命令连接到目标机并进行带宽测试: iperf -c <目标机IP地址> 分析测…

    other 2023年10月16日
    00
  • 对angularJs中controller控制器scope父子集作用域的实例讲解

    当然!下面是关于\”对AngularJS中Controller控制器Scope父子集作用域的实例讲解\”的完整攻略,包含两个示例说明。 对AngularJS中Controller控制器Scope父子集作用域的实例讲解 在AngularJS中,Controller控制器的作用是连接视图和数据模型,并管理它们之间的交互。Scope对象用于在Controller和…

    other 2023年8月20日
    00
合作推广
合作推广
分享本页
返回顶部