在this博客作者说下面的函数是一个构造函数:
function Cat(name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = 0;
var catC = new Cat("Fluffy", "White");
Cat
函数的实例具有名称和颜色属性。这是普通和构造函数函数之间的唯一区别吗?
答案 0 :(得分:36)
构造函数是一个普通函数。
这里的不同之处在于使用new
运算符使函数中的上下文(this
)成为新实例,从而让它获取两个属性,并返回此新实例
如果没有new
运算符,则上下文将是外部的(window
如果您的代码在松散模式下处于全局作用域,undefined
如果处于严格模式下。 / p>
也就是说,如果省略new
var catC = Cat("Fluffy", "White");
函数“有效”(如果你没有处于严格模式),但你有两个不同的结果:
catC
为undefined
,因为您的函数不返回任何内容name
和color
现在是外部作用域的属性因此,整个魔法在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函数,然后获得您的对象。如果我们有几种类型的对象说部门怎么办?然后我们还将有一个函数来创建一个部门对象并将其返回。
那么,这些功能中常见的是什么。它是: -
创建空对象
var myObj = {};
填充后返回对象
返回myObj;
创建空对象和返回对象在创建对象的所有函数中很常见。 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");
答案 2 :(得分:3)
Dystroy有它。
另一种说法是,一个函数在使用new
运算符,构造时调用一个'构造函数' 一个新的类实例。
这也是所提到的函数名中的大写约定的原因,因此其他开发人员可以看到它是一个构造函数,并且符合当前命名classes
的约定
答案 3 :(得分:1)
在面向对象的编程中,类中的构造函数是一种特殊类型的子例程,用于创建对象。它准备新对象以供使用,通常接受构造函数用于设置所需成员变量的参数。
因此var catC = new Cat("Fluffy", "White");
创建了构造函数类Cat