构造函数和普通函数的区别
1、构造函数也是一个普通函数,创建方式和普通函数一样,但是构造函数习惯上首字母大写
2、调用方式不一样
2.1、普通函数的调用方式:直接调用person()
2.2、构造函数的调用方式:需要使用new关键字来调用 new Person()
3、构造函数与类名相同
Person()这个构造函数,Person既是函数名,也是这个对象的类名
4、构造函数内部用this来构造属性和方法
// 普通函数内部不建议使用this
// 构造函数内部,this指向的构造出来的对象
// 普通函数内部,this指向的时window全局对象,无意间就会为window添加了一些全局变量或函数
function Person (name, age) {
this.name = name;
this.age = age;
this.sayHi = function () { alert('Hi') }
}
5、构造函数的执行流程
5.1、立刻在堆内存中创建一个新的对象
5.2、将新建的对象设置为函数中的this
5.3、逐个执行函数中的代码
5.4、将新建的对象作为返回值
6、普通函数没有返回值,为undefined,构造函数回马上创建一个新对象,并将改对象作为返回值返回
// 普通函数
function person () {};
var per = person();
console.log(per); // undefined
// 构造函数,默认返回this,也就是新的实例对象
function Person () {};
var per = new Person();
console.log(per); // [object, object]
7、构造函数执行 var p = new Person() 的情况
7.1、创建一个空对象
var p = {};
7.2、this变量指向对象p
Person.call(p)
7.3、p继承了构造函数Person()的原型
p.__proto__ = Person.prototype
7.4、执行构造函数Person()内的代码
7.5、return 对象p