JavaScript中函数和构造函数的区别是什么?
What are all the differences between function and constructor function in JavaScript?
在这个博客中作者说下面的函数是一个构造函数:
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");
函数"工作"(如果你不是在严格模式下),但你有两个不同的结果:
-
catC
是undefined
作为你的函数返回什么 -
name
和color
现在是外部作用域 的属性
当代码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提供了一个快捷方式,让你可以为创建对象编写函数。这些特殊的函数称为构造函数。构造函数是让你填充你需要创建的对象的函数。
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
的新实例
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- emu -model、emu -restless和emu之间的主要区别(优缺点)是什么?
- function()在jQuery中是什么意思?这个和$(这个)有什么区别