javascript - new关键字的底层实现原理
本文介绍了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屋!
查看全文