声明一个构造函数,通过new运算符都经过了哪些步骤?
先说一下构造函数:函数用来初始化(new运算符)一个新建的对象,
- 可以调用函数中this
- 箭头函数不能通过new的方式调用
function Person(name) { this.name = name; } Person.prototype.age = '25'; var p = new Person('程序员劝退师');
1、new的过程主要执行三个步骤
// 1、创建一个空对象{} var obj = new Object(); // 2、将空对象的原型赋值为构造函数的原型 obj.__proto = Person.prototype; // 3、更改构造器函数内部的this,将其指向新的创建的空对象 Person.apply(obj); // 4、返回new1的对象obj,如果没有返回对象直接返回this return obj;
2、模拟new运算符实现过程
function NewObj() { // 1、创建一个空对象 var obj = new Object(); // 2、取出参数中的构造函数,默认第一个为构造函数 var Constructor = [].shift.call(arguments); // 3、将空对象的原型赋值为构造函数的原型 obj.__proto = Constructor.prototype; // 4、修改空对象obj的this指向,并把剩下参数进行传递 var resut = Constructor.apply(obj, arguments); // 5、返回结果 return typeof resut === 'object' ? resut : obj; } var p1 = NewObj(Person, '劝退师');