JavaScript中函数和构造函数的区别是什么?

What are all the differences between function and constructor function in JavaScript?

本文关键字:区别 是什么 构造函数 函数 JavaScript      更新时间:2023-09-26

在这个博客中作者说下面的函数是一个构造函数:

function Cat(name, color) {
  this.name = name;
  this.color = color;
}
Cat.prototype.age = 0;
var catC = new Cat("Fluffy", "White");

Cat函数的实例有一个名称和颜色属性。这是普通函数和构造函数函数之间的唯一区别吗?

构造函数是普通函数。

这里的不同之处在于使用了new运算符,它使函数中的上下文(this)成为新的实例,从而使它获得两个属性,并返回这个新实例。

如果没有new操作符,上下文将是外部的(如果您的代码在松散模式下处于全局作用域,则为window,如果在严格模式下为undefined)。

也就是说,如果省略了new

var catC = Cat("Fluffy", "White");

函数"工作"(如果你不是在严格模式下),但你有两个不同的结果:

  • catCundefined作为你的函数返回什么
  • namecolor现在是外部作用域
  • 的属性
因此,整个神奇之处在于新的操作符:

当代码new foo(…)被执行时,会发生以下事情:

继承foo.prototype创建一个新对象。

使用指定的参数和调用构造函数foo它绑定到新创建的对象。New foo等价于NewFoo(),即如果没有指定参数列表,则调用Foo参数。

构造函数返回的对象变成整个新表达式的结果。如果构造函数没有显式返回一个对象,在步骤1中创建的对象是而不是使用。(通常构造函数不返回值,但是它们可以选择这样做,如果他们想覆盖普通对象创建过程。)

当我说它是一个普通的函数I时,我忽略了一件事:开发人员的意图。你通常定义函数要么作为构造函数调用(即使用new),要么不调用。在第一种情况下,您最经常使用参数来初始化实例的字段(使用this.name = ...),并且您经常随后向原型添加函数(就像您所做的那样),以便它们对所有实例可用。为了使你的意图更清楚,习惯上以大写字母开始命名构造函数。

让我们举一个例子来理解Javascript中构造函数的诞生。假设您被要求创建一个employee对象,它应该有4个属性:firstName、lastName、性别和名称。好!你说没问题的。

var employee1={};
employee1.firstName="Anoop";
employee1.lastName="Rai";
employee1.gender="M";
employee1.designation="Software Engineer";
上面的

是最简单的方法,首先创建空对象,然后将所有4个属性关联到对象(当然,您也可以通过内联创建相同的对象)。如果您再次被要求创建具有相同属性的另一个雇员对象,该怎么办?

var employee2={};
employee1.firstName="Ram";
employee1.lastName="Kumar";
employee1.gender="M";
employee1.designation="Associate Software Engineer";

似乎没有问题。现在,如果你被问到总共有100个雇员,你刚刚创建了其中的2个,通常你需要创建另外98个雇员对象。现在你不会像上面那样创建对象,因为它看起来很乏味。明白了!让我们创建一个工厂方法它将被调用任意次数它将创建对象,然后返回给我们。是啊!写一次就会用到很多次。

function createEmployeeObject(firstName, lastName, gender, designation){
  var employee={};
  employee.firstName=firstName;
  employee.lastName=lastName;
  employee.gender=gender;
  employee.designation=designation;
  return employee;
} 
var employee3=createEmployeeObject("Harry", "Dsouza", "M", "Project Manager");

更方便的方式,没有任何重复的代码。只需调用createEmployeeObject函数与你的参数,作为回报,你得到你的对象。如果我们有几种类型的对象,比如department。然后,我们还将有一个函数来创建一个department对象并返回它。

那么,这些函数的共同点是什么呢?它是:->

li>

创建空对象

var myObj = {};

  • 填充后返回对象

    返回myObj;

  • 创建空对象和返回对象在所有创建对象的函数中都是通用的。Javascript创建了一个快捷方式,使您在使用创建对象的函数时不必编写这些行。所以,这两行可以跳过。方法是使用构造函数。

    使用函数来创建对象在Javascript中是相当普遍的,所以Javascript提供了一个快捷方式,让你可以为创建对象编写函数。这些特殊的函数称为构造函数。构造函数是让你填充你需要创建的对象的函数。

    function createEmployeeObject(firstName, lastName, gender, designation){
      this.firstName=firstName;
      this.lastName=lastName;
      this.gender=gender;
      this.designation=designation;
    }
    var employee4=new createEmployeeObject("Alan", "Marks", "F", "Business Analyst");
    

    你必须知道这个关键字,它指向当前对象。记住,在构造函数中,Javascript为我们创建了空对象,所以这实际上只指向那个对象。javascript constructor函数在填充对象后自动返回对象。现在,如何告诉Javascript函数是在构造函数模式下调用的呢? new关键字告诉Javascript将函数视为构造函数。每次需要对象时,使用new关键字,然后调用一个函数,然后该函数为我们准备一个对象并返回它。

    即使Javascript不是基于类的,你也必须注意构造函数的名称。用驼峰字体不好,用普通字体。

    function Employee(firstName, lastName, gender, designation){
      this.firstName=firstName;
      this.lastName=lastName;
      this.gender=gender;
      this.designation=designation;
    }
    var employee5=new Employee("Mark", "Watson", "M", "DBA");
    

    http://jkoder.com/javascript-constructors-why-it-should-be-used-object-oriented-programming-in-javascript/

    Dystroy有它

    另一种说法是,当使用new操作符调用函数时,变成一个"构造函数",构造一个新的类实例。

    这也是前面提到的函数名大写约定的原因,这样其他开发人员就可以看到它是一个构造函数,这符合当前命名classes

    在面向对象编程中,类中的构造函数是一种特殊类型的子程序,用于创建对象。它准备新对象以供使用,通常接受构造函数用来设置所需成员变量的实参。

    因此var catC = new Cat("Fluffy", "White");创建了构造函数类Cat的新实例