您的位置:首页 > Web前端 > JavaScript

javaScript使用new关键字时发生了什么?

2016-04-21 10:15 471 查看
作者:何幻

链接:https://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
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息