函数是一个具有功能的对象,函数的实参可以是个对象,也可以是个函数,
1.构造函数
var fun = new Function()
2.函数的声明创造
function 函数名([形参1,形参2,形参3...]){
语句...
}
//调用
函数名()
函数里的形参是可选的,写不写都可
3.函数表达式创造函数
var 函数名 = function ([形参1,形参2,形参3...]){
语句...
}
//调用
函数名()
函数名()-->调用函数,相当于使用函数的返回值
函数名 -->函数对象,相当于直接使用函数对象
4.立即执行函数
(function(){alert('哈哈')})()
函数执行完,立即执行,只会执行一次
5.利用构造函数的方法,创建对象
1.工厂方法创建的对象都是object类型,无法区分不同类型的对象,我们可以创建一个构造函数,用来创建对象
2.构造函数习惯上首字母大写
3.普通函数直接调用,而构造函数需要使用new关键字来调用
执行流程:
1.立即创建一个新的对象
2.将创建的对象设置为函数中的this,在构造函数中使用this引用新建对象
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回
构造函数优化工厂方法创建对象
function Person(name,age){
this.name = name;
this.age = age;
this.sayname = function(){
console.log('大家好,我是'+this.name+',今年'+this.age+'岁了')
};
}
var per = new Person('孙悟空',500); //通过Person创建的per对象
var per1 = new Person('猪八戒',28,);
per.sayname()
console.log(per)
console.log(per1)
优化版:把函数里的sayname方法取出来,减少每次调用函数时都要重新创建一个方法的时间,效率优化
function Person(name,age){
this.name = name;
this.age = age;
this.sayname = fun;
}
function fun(){
console.log('大家好,我是'+this.name+',今年'+this.age+'岁了')
}
var per = new Person('孙悟空',500);
var per1 = new Person('猪八戒',28,);
per.sayname()
console.log(per)
console.log(per1)
项目中可能会遇见同样的函数名,避免这一现象,可以利用原型对象进行优化
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayname=function (){
console.log('大家好,我是'+this.name+',今年'+this.age+'岁了')
}
var per = new Person('孙悟空',500);
var per1 = new Person('猪八戒',28,);
per.sayname()
console.log(per)
console.log(per1)
使用同一构造函数创建的对象,称为一类对象/一个类
将通过一个构造函数创建的对象,称为该类的实例
6.instomceof
使用instomceof可以检查一个对象是否是一个类的实例
语法: 对象 instomceof 构造函数
所有的对象都是object的后代,所以任何对象和object做instomceof检查时都会返回true
7.函数嵌套
函数里面嵌套的函数调用时只能在里面使用,不能在全局使用
function fun() {
var a = 30
console.log(a)
function say() {
var b = 20
console.log(b)
}
say()
}
fun()
但是用函数表达式的方式去构造函数是可行的,因为函数被声明了,上者没被声明属于全局
var fun = function() {
var a = 30
console.log(a)
say = function() {
var b = 20
console.log(b)
}
}
fun()
say()