javascript 构造函数强制调用经验总结


Posted in Javascript onDecember 02, 2012

兴致勃勃地定义了下面这么个构造函数:

var Coder = function( nick ){ 
this.nick = nick; 
};

定义构造函数结束后呢?没错,赶紧实例化:
var coder = Coder( 'casper' );
这个coder兄弟叫什么名字?赶紧打印下:
console.log( coder.nick ); //undefined 
= =b 竟然是undefined!!再回过头看看实例化的那个语句,不难发现问题出在哪里:少了个new 
var coder = Coder( 'casper' ); //当作普通的函数来调用,故内部的this指针其实指向window对象 
console.log( window.nick); //输出:casper 
var coder = new Coder( 'casper' ); //加上new,一切皆不同,this正确地指向了当前创建的实例 
console.log( coder.nick ); //输出:casper

关于this指针的指向问题不是本文讨论的内容,可以参考下犀牛书相关章节
这样的错误貌似挺低级的,但出现的概率挺高的,肿么去避免或减少这种情况的发生呢?
可以在内部实现里面动下手脚:
var Coder = function( nick ){ 
if( !(this instanceof Coder) ){ 
return new Coder( nick ); 
} 
this.nick = nick; 
};

其实很简单,实例化的时候,内部判断下,当前this指向的对象的类型即可,如果非当前构造函数的类型,强制重新调用一遍构造函数。
突然觉得Coder这名字不够洋气?想用Hacker,好吧,我改。。。数了下,一共有三处要改,这不科学,有没有办法只把构造函数的名字改了就行?
当然有:
var Coder = function( nick ){ 
if( !(this instanceof arguments.callee) ){ 
return new arguments.callee( nick ); 
} 
this.nick = nick; 
};
 
tips:据说在ES 5的严格模式下面arguments.callee会被禁用,不过仅当ES 5普及同时你指定了要使用严格模式,否则还是可以用的发散下思维:在JQ里面包打天下所向披靡的$,大家都知道它会返回一个jquery对象,如下:
var jObject = $('#node_id');
有没有发现,这里同样没有new!应该猜到怎么回事了吧。原理是差不多的,不过里面的实现要复杂得多,有空再把JQ里面的实现拔下写下总结
Javascript 相关文章推荐
一起来写段JS drag拖动代码
Dec 09 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
Aug 31 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
浅析node.js的模块加载机制
May 25 Javascript
vue改变循环遍历后的数据实例
Nov 07 Javascript
js精度溢出解决方案
Dec 02 #Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 #Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 #Javascript
javascript控制swfObject应用介绍
Nov 29 #Javascript
javascript 保存文件到本地实现方法
Nov 29 #Javascript
jquery连缀语法如何实现
Nov 29 #Javascript
javascript 使td内容不换行不撑开
Nov 29 #Javascript
You might like
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
shiro授权的实现原理
2017/09/21 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
简单的三步vuex入门
2018/05/20 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
python根据日期返回星期几的方法
2015/07/06 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python中有函数重载吗
2020/05/28 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
SQL面试题
2013/12/09 面试题
鼓舞士气的口号
2014/06/16 职场文书
2014年文员工作总结
2014/11/18 职场文书
股权转让协议书
2014/12/07 职场文书
2014年教研员工作总结
2014/12/23 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技