手写一个new

350 阅读1分钟

掘金第一篇文章

趁着下班赶快写一篇,一会回家。

简单的实现new

  1. 创建一个空的简单JavaScript对象(即{});
  2. 链接该对象(即设置该对象的构造函数)到另一个对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this。

注意这四点,这是实现原理

function NEW(fn){
    var res={}
    if(fn.prototype!==null)
      res._proto_=fn.prototype
    var ret = fn.apply(res,Array.prototype.slice.call(arguments,1))
    if((typeof ret === 'function' || typeof ret==='object') && ret!==null){
        return ret
    }
    return res
}
function A(a,b){
    this.a = a
    this.b = b
}
var obj = New(A, 1, 2);
obj.a => 1
obj.b => 2

var obj1 = new A(1, 2);
obj1.a => 1
obj1.b => 2

完了

现在大概解析一下NEW

//创建了一个新对象。这个对象的类型就是{}
 var res={}
 
 //将新创建的对象内部(res)的_proto_属性设置为外部可访问的原型(fn)对象prototype
 if(fn.prototype!==null)//判断外部原型对象是否可以访问
      res._proto_=fn.prototype

//使用apply改变原型(fn)中的this指向并传值,获取函数结果
//如果原型有return返回值ret获取到返回值,没有就是undefined
//例:function A(a,b){return 1},这样的话ret就是1
 var ret = fn.apply(res, Array.prototype.slice.call(arguments, 1))
 
//原型的返回值,为对象或函数时return原型的返回值
if ((typeof ret === 'object' || typeof ret === 'function') && ret !== null) {
    return ret
}

//返回新对象
return res