JavaScript函数总结
一、构造函数
一般构造函数:
function Student(name, age){
this.name = name;
this.age = age;
}
var s1=new Student("roy", 18);
console.log(s1 instanceof Student); //true
console.log(s1); //Student {name: "roy", age: 18}
构造函数:
function Student(){
return 123;
}
var s1=new Student();
console.log(s1 instanceof Student); //true
console.log(s1); //Student对象
普通函数:
function Student(){
return [];
}
var s1=new Student();
console.log(s1 instanceof Student); //false
console.log(s1); //[]空数组
提出问题:看起来函数返回值的不同导致函数功能出现了变化,那究竟为什么会这样呢?
分析问题:
我们先来看看构造函数的执行流程,如下:
- 立刻在堆内存中创建一个新的对象
- 将函数中的this指向新建的对象
- 将新建的对象的_proto_指向构造函数的prototype
- 逐个执行函数中的代码
- 将新建的对象作为返回值
试一下:
function Student(){
console.log(this); //Student {}
return [];
}
var s1=new Student();
console.log(s1 instanceof Student); //false
console.log(s1); //[]
从上面可以看出new Student()时确实新建了一个Student对象并设置为this,但这里没有return新建的对象。
如果没有return语句,则默认return新建的对象。
如果有return语句:如果return的是基本数据类型(num string bool undefined null),则忽略并返回新建的对象;如果return的是复杂数据类型,则执行return语句丢弃新建的对象。