一、js函数函数
简单的说就是重复执行的代码块。函数是一段JavaScript 代码,它只定义一次,但可能被执行或调用任意次。
1、函数的定义方式:
1)声明式:这种定义的⽅式,⽆论在哪⼉定义,别处都可以调⽤ function fn( ){ };
2)表达式:此时函数作为表达式存在,调⽤只能在定义的后⾯; 解释⼀下表达式:将数据和运算符等联系起来就称为表达式
var fn=function () { };
3)以 new 创建函数:解释: Function构造函数所有的参数都是字符串类var fn = new Function (arg1 , arg2 ,arg3 ,…, argN , body )最后⼀个参数, 其余的参数都作为⽣成函数的参数即形参。这⾥可以没有参数。最后⼀个参数, 表⽰要创建函数的函数体。
js 中任意函数都是Function 的实例
3、构造函数介绍
主要⽤来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符⼀起使⽤在创建对象的语句中。
1)⾸先,它是函数,并且任何的函数都可以作为构造函数存在,它的本质是初始化对象。
2)构造:它是创造、设计。将没有的东西先概念实现,⽐如建筑图纸构造函数:
3)构造函数都是和new 关键词⼀起使⽤的。
4)new就是在创建对象,从⽆到有,构造函数就是作用就是为初始化的对象添加属性和⽅法( 成员 )
4、利用构造函数创建对象的方法
1)对象字面量

这种写法的缺点是,每创建⼀个新的对象都需要写出完整的定义语句,不便于创建⼤量相同类型的对象,不利于使⽤继承等⾼级特性。
2)构造函数创建对象(调用构造函数)
使用 new 命令可以调用构造函数,创建实例,并返回这个对象。
new表达式是配合构造函数使⽤的,例如new String(“a string”),调⽤内置的String构造函数构造了⼀个字符串对象。
下⾯我们⽤构造函数的⽅式来重新创建⼀个实现同样功能的对象,
⾸先是定义构造函数,然后是调⽤new表达式创建新对象:



使⽤new操作符来调⽤⼀个构造函数的时候,发⽣了什么呢?其实很简单,就发⽣了四件事
var obj ={};
//将构造函数对象的prototype成员对象指向实例
obj.__proto__ =Obj.prototype;
//设置构造函数体的this指向,让他指向实例
Obj.call(obj);
//执行函数代码
return obj;
第⼀⾏,创建⼀个空对象obj。
第⼆⾏,将这个空对象的__proto__成员,指向了构造函数对象的prototype成员对象(new为obj 创建一个指针指向 构造函数对象的prototype成员 对象)
第三⾏,将构造函数的作⽤域赋给新对象,因此Obj函数中的this指向新对象obj,然后再调⽤Obj函数。于是我们就给obj对象赋值了
第四⾏,返回新对象obj。当构造函数⾥包含返回语句时情况⽐较特殊,这种情况会在下⽂中说到。
我们最熟悉的Vue实际上就是一个函数,
1)当使用new关键词时,创建一个空对象,
2)new将这个实例的原型指向Vue()的protitype属性,
3)将Vue()函数的this指向实例,执行Vue函数的代码
4)最后return 实例,
5)至此我们获取到一个Vue对象


函数构造可以接收参数,以便初始化实例对象。如果不需要传递参数,可以省略小括号,直接使用 new 命令斯奥用,下面两行代码是等价的。

如果不使用 new 命令,直接使用小括号调用构造函数,
这时构造函数就是普通函数,不会生成实例对象,
this 就代表调用函数的对象,在客户端指代全局对象 window。
为了避免误用,最有效的方法是在函数中启用严格模式。这样必须使用new关键字才能调用
代码如下。

或者使用 if 对 this 进行检测,如果 this 不是实例对象,则强迫返回实例对象。

网友评论