javascript - new关键字的底层实现原理

查看:183
本文介绍了javascript - new关键字的底层实现原理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

new关键字的实现原理


function _new(/* constructor, param, ... */) {
  var args = [].slice.call(arguments);
  var constructor = args.shift();
  var context = Object.create(constructor.prototype);
  var result = constructor.apply(context, args);
  return (typeof result === 'object' && result != null) ? result : context;
}

var actor = _new(Person, "张三", 28);

函数内部的四句话都不是很明白,希望大神能够大显神威

解决方案

  • 第一句:将_new的参数列表转成数组类型。

  • 第二句:从参数列表中弹出第一个参数赋给constructor,同时args保留剩余的参数作为构造函数的参数。

  • 第三句:构造出context对象,这个对象的原型是constructor.prototype,这样一来context就被挂到了正确的原型链上面。因为通常原型链上会定义类的方法,所以这一步用来实现方法的挂载。

  • 第四句:这一步骤,实现了对构造函数内部代码的执行,通常是一些对象属性的初始化。例如this.name = name;之类的。所以这一步用来实现属性的定义和初始化。

值得注意的一点是:return那句为什么会有个判断?为什么有可能返回context有可能返回result?

这是因为有些构造函数里面可能有return xxx的语句。这种情况下,如果同时xxx是个对象的话,那么最终就返回result,否则就返回前面构造出来的context。这一点正是ECMAScript规范中new关键字的意义要求的。

这篇关于javascript - new关键字的底层实现原理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆