JavaScript中的 new这个语法糖到底做了啥?

前端 2019-10-17T15:03:18 浏览:155

“语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。”

1.模拟new的实现过程:

function Person (name) {
  this.name = name
}
function _new(){
  // 1、创建一个新对象
  let newObj = {};
  // 默许第一个传进来的参数为构造函数
  let [constructor, ...args] = [...arguments];
  // 2、原型链连接
  newObj.__proto__ = constructor.prototype;
  // 3、将构造函数的属性和方法添加到这个新的空对象上,改变上下文。
  let result = constructor.apply(newObj, args);
  // 4、对象返回
  if(result && (typeof result == "object" || typeof result == "function")){
    // 如果构造函数返回的结果是一个对象,就返回这个对象
    return result
  }
  // 如果构造函数返回的不是一个对象,就返回创建的新对象。
  return newObj
}
let p1 = _new(Person, "mla");
console.log(p1.name); // mla

1.创建一个新对象
2.原型链连接,让新对象继承构造函数
3.将函数的作用域赋给新对象(产生一个新的上下文),执行函数中的代码(为新对象添加属性、方法)
4.观察第3步返回的返回值,无返回值或者返回一个非对象值时,则将创建的新对象返回,否则会将返回值作为新对象返回

新对象继承构造函数

2.直接使用提供的new实现以上过程

function Person (name) {
  this.name = name
}
let p1 = new Person('mla');
console.log(p1.name); // mla

效果一摸一样

总结:通过new操作符,我们可以创建原对象的一个实例对象,而这个实例对象继承了原对象的属性和方法,所以new存在的意义在于它实现了javascript中的继承,而不仅仅是实例化了一个对象。