javascript中,new操作符的工作原理是什么?
2015-11-17 14:17
441 查看
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:何幻
链接:http://www.zhihu.com/question/36440948/answer/71234418
来源:知乎
你要的真相在这:
用new调用一个函数发生了这些事:
(1)新建一个对象
(2)设置原型链
(3)让F中的this指向instance,执行F的函数体。
(4)判断F的返回值类型:
如果是值类型,就丢弃它,还是返回instance。
如果是引用类型,就返回这个引用类型的对象,替换掉instance。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:
(1)如果没有写return,相当于return undefined,JavaScript中的函数都是这样。undefined是值类型的,因此丢弃它,返回instance。
(2)如果return this相当于返回一个引用类型的对象,它自己就是instance,无所谓替换不替换了。
(3)对instance并不需要设置它的constructor属性,这个属性在instance的原型中。
而且,任意一个新函数在创建时,原型的constructor就已经设置好了。
于是,这也要求我们在对prototype重新赋值的时候,重新指定constructor属性。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:何幻
链接: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 };
相关文章推荐
- JS实现IE下打印和打印预览
- Javascript 知识点整理
- 基于pjsip和webrtc封装sip客户端 技术选型
- 记住密码功能 angular js实现
- JS开发HTML5游戏《神奇的六边形》(四)
- JS-input框校验
- 解决js动态改变dom元素属性后页面及时渲染问题
- input js判断
- js控制输入法关闭
- JS gzip加密字符串并base64输出
- 从头开始写框架(一):浅谈JS模块化发展
- JavaScript break跳出多重循环
- js判断checkbox是否被选中
- JavaScript变量存储浅析(二)
- Javascript中alert</script>的方法
- js控制iframe跳转
- JSON transformers
- js实现checkbox复选框全选/全不选
- 使IE6支持PNG透明图片的JS插件
- 通用js地址选择器