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);
函数内部的四句话都不是很明白,希望大神能够大显神威
大家讲道理2017-04-10 17:25:32
第一句:将_new
的参数列表转成数组类型。
第二句:从参数列表中弹出第一个参数赋给constructor
,同时args
保留剩余的参数作为构造函数的参数。
第三句:构造出context
对象,这个对象的原型是constructor.prototype
,这样一来context
就被挂到了正确的原型链上面。因为通常原型链上会定义“类”的方法,所以这一步用来实现方法的挂载。
第四句:这一步骤,实现了对构造函数内部代码的执行,通常是一些对象属性的初始化。例如this.name = name;
之类的。所以这一步用来实现属性的定义和初始化。
值得注意的一点是:return那句为什么会有个判断?为什么有可能返回context有可能返回result?
这是因为有些构造函数里面可能有return xxx
的语句。这种情况下,如果同时xxx是个对象的话,那么最终就返回result,否则就返回前面构造出来的context。这一点正是ECMAScript规范中new关键字的意义要求的。