声明一个构造函数,通过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, '劝退师');

 

 
posted @ 2021-02-16 19:31  程序員劝退师  阅读(122)  评论(0编辑  收藏  举报