JavaScript中的函数和构造函数之间有什么区别?

时间:2014-03-14 09:54:39

标签: javascript function constructor this

this博客作者说下面的函数是一个构造函数

function Cat(name, color) {
  this.name = name;
  this.color = color;
}
Cat.prototype.age = 0;

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

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

4 个答案:

答案 0 :(得分:36)

构造函数是一个普通函数。

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

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

也就是说,如果省略new

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

函数“有效”(如果你没有处于严格模式),但你有两个不同的结果:

  • catCundefined,因为您的函数不返回任何内容
  • namecolor现在是外部作用域的属性

因此,整个魔法在the new operator

  

当执行代码new foo(...)时,会发生以下情况:

     

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

     

在   使用指定的参数调用构造函数foo   这绑定到新创建的对象。 new foo相当于new   foo(),即如果没有指定参数列表,则调用foo   参数。

     

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

当我说这是一个正常的函数我时,我省略了一件事:开发人员的意图。您通常将函数定义为构造函数(即使用new)或不作为构造函数。在第一种情况下,您最常使用参数来初始化实例的字段(使用this.name = ...),然后通常会在原型中添加函数(就像您一样),以便它们可用于所有实例。为了明确您的意图,通常以大写字母命名构造函数。

答案 1 :(得分:7)

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

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函数,然后获得您的对象。如果我们有几种类型的对象说部门怎么办?然后我们还将有一个函数来创建一个部门对象并将其返回。

那么,这些功能中常见的是什么。它是: -

  1. 创建空对象

    var myObj = {};

  2. 填充后返回对象

    返回myObj;

  3. 创建空对象和返回对象在创建对象的所有函数中很常见。 Javascript创建了一个快捷方式,当您使用创建对象的函数时,它不允许您编写这些行。因此,可以跳过这两行。这样做的方法是使用Constructors。

    在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为我们创建空对象,所以这实际上只指向该对象。 Javscript Construtor函数在填充后自动返回对象。现在如何告诉Javascript在构造函数模式下调用函数,它是告诉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/

答案 2 :(得分:3)

Dystroy有它。

另一种说法是,一个函数在使用new运算符构造时调用一个'构造函数' 一个新的类实例。

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

答案 3 :(得分:1)

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

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

的新实例