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 相关文章推荐
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
jquery子元素过滤选择器使用示例
Jun 24 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
Dec 26 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
Mar 24 Javascript
漂亮实用的页面loading(加载)封装代码
Feb 03 Javascript
AngularJS中scope的绑定策略实例分析
Oct 30 Javascript
一些你可能不熟悉的JS知识点总结
Mar 15 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
用JavaScript实现贪吃蛇游戏
Oct 23 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
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
PHP文件操作详解
2016/12/30 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
jquery 问答知识整理
2010/02/11 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
python实现跨文件全局变量的方法
2014/07/07 Python
Python实现CET查分的方法
2015/03/10 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python保存数据到本地文件的方法
2018/06/23 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
英国自行车商店:AW Cycles
2021/02/24 全球购物
金士达面试非笔试
2012/03/14 面试题
代理协议书范本
2014/04/22 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
周一问候语大全
2015/11/10 职场文书