掘金第一篇文章
趁着下班赶快写一篇,一会回家。
简单的实现new
- 创建一个空的简单JavaScript对象(即{});
- 链接该对象(即设置该对象的构造函数)到另一个对象 ;
- 将步骤1新创建的对象作为this的上下文 ;
- 如果该函数没有返回对象,则返回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