问题:
什么是构造函数以及作用?
构造函数与普通函数区别是什么?
用new关键字的时候到底做了什么?
构造函数有返回值怎么办?
构造函数能当普通函数调用吗?
1.什么是构造函数以及作用?
(说人话的解释:构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数,它只是概念上的一个定义,使用它用来实例化对象。)
作用:普通函数作为完成一个功能而存在,比如,实现一个加法功能的函数add;而构造函数里有属性和方法)
概念性解释:JavaScript的构造函数并不是作为类的一个特定方法存在的;当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。一个函数要作为一个真正意义上的构造函数,需要满足下列条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
2.构造函数与普通函数区别是什么?
说人话的解释:任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数 ;
任何函数,如果不通过 new 操作符来调用,那它跟普通函数也没有什么两样。
例子:
对于函数 function fn() { }:
构造函数:1. var f = new fn( );
2 .构造函数内部会创建一个新的对象,即fn的实例f
3. 函数内部的this指向 新创建的fn的实例f
4. 默认的返回值是fn的实例f
普通函数:1. fn( );
2. 在调用函数的内部不会创建新的对象
3. 函数内部的this指向调用函数的对象(如果没有对象调用,默认是window)
4. 返回值由return语句决定
3.用new关键字时到底做了什么(以上面的构造函数为例)
var f ={}; //1.第一步,创建一个空对象。
f.__proto__ = fn.prototype; //2.第二步,将构造函数fn()中的this指向新创建的对象f。
fn.call(f); // 3.第三步,将f的_proto_属性指向fn构造函数的prototype,创建对象和原型间关系
return f; // 4.第四步,返回新对象f。
抽象理解:
第一行,创建一个空对象obj。
第二行,将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象,这是最关键的一步。(理解第二步的作用:将新生成的对象的__prop__属性赋值为构造函数的prototype属性,使得通过构造函数创建的所有对象可以共享相同的原型。这意味着同一个构造函数创建的所有对象都继承自一个相同的对象,因此它们都是同一个类的对象。)
第三行,将构造函数的作用域赋给新对象,即构造函数中的this指向新对象obj,然后再调用构造函数,这样就给obj对象赋值了成员变量。
第四行,返回新对象obj。
4.构造函数有返回值怎么办?
构造函数有一个默认的返回值:即新创建的对象(实例);
当手动添加返回值后(return语句):
1. 返回值是基本数据类型-->真正的返回值还是那个新创建的对象(实例)
2. 返回值是复杂数据类型(对象)-->真正的返回值是这个对象
例子:
<script>
function Fun1() {
var f2 = new Fun2();
console.log(f2); //返回{a: 3}
console.log(this); //window
return true;
}
function Fun2() {
console.log(this); //Fun2类型的对象 不是Fun2函数
// this.age = 30;
return {a: 3};
}
var f1 = Fun1();
console.log(f1); // true
</script>
5.构造函数可以当普通函数使用吗?
可以。