new操作符

74 阅读1分钟
function Person(name) {  //创建一个构造函数
    console.log(this); // Person {} 空的person 对象
    this.name = name;  //this指的是构造函数的实例(给实例添加name属性)
}
Person.prototype.age = 18; //给构造函数的原型添加属性age

let man1 = new Person('利利') //构造函数的实例1
let man2 = new Person('张三') //构造函数的实例2

console.log(man1);
console.log(man1.name);
console.log(man1.age);
console.log(man2);
console.log(man2.name);
console.log(man2.age);

打印结果:

image.png

思考: new操作符做了什么事?

  1. 创建一个空对象(即{});
  2. 该对象的__proto__属性指向构造函数的原型(prototype);
  3. 将该对象作为this的上下文 ;即执行构造函数,他的this是构造函数的实例。
  4. 如果构造函数没有返回对象,则返回this。

手动写一个函数,实现new操作符做的事

 function _new (ctor, ...args) {
  // 第一步,创建新对象
  var obj = {};
  
  // 第二步,对象的__proto__属性指向构造函数
  obj.__proto__ = ctor.prototype
  
  // 第三步,执行构造函数,并将构造函数的初始属性都挂载在新对象上
  var result = ctor.call(obj, ...args);
  
  // 返回新对象
  return typeof result === 'object' ? result : obj;
}

let man3 = _new(Person, '老王');
console.log(man3);

打印结果:

image.png

相关知识点call,apply

背景: 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文 而存在的,换句话说,就是为了改变函数体内部 this 的指向。

语法:

  • apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数是数组。
  • call()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数必须例举出来