javascript中,new操作符的工作原理是什么?

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:何幻
链接:http://www.zhihu.com/question/36440948/answer/71234418
来源:知乎

你要的真相在这:
var F=function(){
    //this指向谁,在定义时是不知道的
};

var p=new F;

用new调用一个函数发生了这些事:
(1)新建一个对象
instance=new Object();
(2)设置原型链
instance.__proto__=F.prototype;
(3) 让F中的this指向instance,执行F的函数体。
(4)判断F的返回值类型:
如果是值类型,就丢弃它,还是返回instance。
如果是引用类型,就返回这个引用类型的对象,替换掉instance。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

注:

(1)如果 没有写return,相当于return undefined,JavaScript中的函数都是这样。undefined是值类型的,因此丢弃它,返回instance。
(2)如果 return this相当于返回一个引用类型的对象,它自己就是instance,无所谓替换不替换了。
(3)对instance并 不需要设置它的constructor属性,这个属性在instance的原型中。
console.assert(!p.hasOwnProperty('constructor'));
console.assert(F.prototype.hasOwnProperty('constructor'));
而且,任意一个新函数在创建时,原型的constructor就已经设置好了。
var G=function(){};
console.assert(G.prototype.hasOwnProperty('constructor'));
console.assert(G.prototype.constructor===G);
于是,这也要求我们在对prototype重新赋值的时候, 重新指定constructor属性
F.prototype={
    constructor:F
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值