普通函数与构造函数的区别
JS函数
函数简单的说就是可重复执行的代码块。函数是一段JavaScript 代码,它只定义一次,但可能被执行或调用任意次。
函数的定义方式
- 声明式函数定义:
function fn() {};
这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。
- 函数表达式:
let fun = function(){};
此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。
- new Function 形式(构造函数法):
var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );
Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
总结:1 、第一种和第二种函数的定义的方式其实是第三种new Function 的语法糖,当我们定义函数时候都会通过 new Function 来创建一个函数,只是前两种为我们进行了封装,我们看不见了而已,js 中任意函数都是Function 的实例。
2、ECMAScript 定义的 函数实际上是功能完整的对象。
普通函数与构造函数的区别
- 构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写
- 构造函数和普通函数的区别在于:调用方式不一样。作用也不一样(构造函数用来新建实例对象)
- 调用方式不一样。
- 普通函数的调用方式:直接调用 person();
- 构造函数的调用方式:需要使用new关键字来调用 new Person();
- 构造函数的函数名与类名相同:Person( ) 这个构造函数,Person 既是函数名,也是这个对象的类名
- 内部用this 来构造属性和方法
function Person(name,job,age)
{
this.name=name;
this.job=job;
this.age=age;
this.sayHi=function()
{
alert("Hi")
}
}
- 普通函数例子:因为没有返回值,所以为undefined
- 构造函数例子:构造函数会马上创建一个新对象,并将该新对象作为返回值返回
普通函数
function fn() {
console.log('普通函数');
}
构造函数
//创建一个构造函数
function People (name,str) {
this.name = name;
this.fun = function() {
console.log(str);
};
this.act = function () {
console.log("我是"+this.name+str);
};
}
//实例化一个People
var g1 = new People("郭小妹","美美美");
var g2 = new People("东东","吃吃吃")
g1.fun();
g1.act();
g2.act();