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

详解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日

相关文章

  • Javascript 高性能之递归,迭代,查表法详解及实例

    Javascript 高性能之递归,迭代,查表法详解及实例 递归 递归是一种通过反复将问题分解成更小的问题来解决问题的方法。在 Javascript 中,递归通常用于处理树状结构或者需要反复处理的问题。 以下是一个简单的递归示例,用于计算阶乘: function factorial(n) { if (n <= 1) { return 1; } else…

    other 2023年6月27日
    00
  • CSS 实现网页图片的预加载

    下面是关于“CSS 实现网页图片预加载”的完整攻略: 什么是图片预加载? 图片预加载指的是在网页完成加载之前,提前加载页面所需的图片资源,从而达到更快的打开速度和更好的用户体验。通常在网页开发中,需要使用 JavaScript 或 CSS 实现图片预加载。 使用CSS 实现图片预加载 使用 CSS 实现图片预加载主要是通过 CSS 中的 :before 或 …

    other 2023年6月25日
    00
  • 教你用Flash制作非常酷的二进制时钟动画

    教你用Flash制作非常酷的二进制时钟动画攻略 介绍 在本攻略中,我们将使用Flash软件来制作一个非常酷的二进制时钟动画。这个动画将显示当前时间的二进制表示,并以动态的方式展示时间的变化。下面是制作这个动画的详细步骤。 步骤 步骤一:创建新的Flash文档 首先,打开Flash软件并创建一个新的文档。选择合适的舞台大小和背景颜色,以适应你的需求。 步骤二:…

    other 2023年8月15日
    00
  • deletefromwhere语法

    以下是“delete from where语法”的完整攻略: delete from where语法 在SQL中,我们可以使用delete from where语法来删除符合条件的记录。以下是delete from where语法的详细步骤: 1. 确定要删除的表 首先,我们需要确定要删除的表。以下是删除名为“my_table”的表的示例: DELETE F…

    other 2023年5月7日
    00
  • 如何解决鼠标右键使用不了怎么点击都没有反应

    如果鼠标右键使用不了,可能会给我们的电脑使用带来很大的不便。以下是解决这个问题的攻略: 1. 检查鼠标设置 首先需要检查鼠标设置是否正确,可能会有一些设置造成了这个问题。具体步骤如下: 打开“设置”,进入“设备”。 点击“鼠标”选项。 点击“其他鼠标选项”。 在弹出的窗口中,检查是否选中了“开启按住 Ctrl 键时,鼠标右键打开上下文菜单”。 如果没有选中,…

    other 2023年6月27日
    00
  • golang中的int类型和uint类型到底有多大?

    Golang中的int类型和uint类型到底有多大? 在Golang中,int类型和uint类型的大小取决于所运行的操作系统和CPU架构。在本攻略中,我们将详细讲解Golang中int类型和uint类型的大小,并提两个示例说明。 int类型和uint类型的大小 在Golang中,int类型和uint类型的大小决所运行的操作系统和CPU架构。在大多数情况下,i…

    other 2023年5月8日
    00
  • 在phpstudy中nginx伪静态配置

    在PHPStudy中,Nginx是一个常用的Web服务器,它可以通过伪静态配置来优化网站的SEO和用户体验。以下是在PHPStudy中Nginx伪静态配置的完整攻略,包含两个示例说明。 步骤一:打开Nginx配置文件 在PHPStudy中,可以使用以下步骤打开Nginx配置文件: 打开PHPStudy控制面板。 点击“Nginx管理”。 点击“配置文件”。 …

    other 2023年5月9日
    00
  • datagridview导出excel(封装)

    datagridview导出excel(封装) 在ASP.NET Web应用程序开发中,经常需要将数据从页面控件中导出到Excel文件中。其中,datagridview是常用的控件之一,可以让我们轻松地展示和编辑数据,同时也可以方便地导出数据到Excel文件中。本文将介绍如何使用C#封装一个datagridview导出excel的通用方法,方便开发者在需要导…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部