构造函数的强制调用
来源:互联网 发布:微信java通用版1.0精简 编辑:程序博客网 时间:2024/06/05 21:52
兴致勃勃地定义了下面这么个构造函数:
var Coder = function( nick ){
this.nick = nick;
};
定义构造函数结束后呢?没错,赶紧实例化:
var coder = Coder( ‘casper’ );
这个coder兄弟叫什么名字?赶紧打印下:
console.log( coder.nick ); //undefined
竟然是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;
};
关于arguments.callee,可参见:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee
tips:据说在ES 5的严格模式下面arguments.callee会被禁用,不过仅当ES 5普及同时你指定了要使用严格模式,否则还是可以用的
- 构造函数的强制调用
- 构造函数的调用
- 构造函数的调用
- 构造函数的调用
- 构造函数的调用
- 复制构造函数的调用
- 串联构造函数的调用
- 构造函数的默认调用
- 各种构造函数的调用
- 构造函数的选择调用
- C++构造函数的调用
- JAVA构造函数的调用
- 拷贝构造函数的调用
- 构造函数的调用顺序
- Java的构造函数调用
- 构造函数的调用规则
- 构造函数的调用规则
- 2233-构造函数的调用
- Filter 过滤器
- Oracle数据库中对误删数据的恢复
- 关于浮点数的小数部分的二进制表示、精度以及浮点数如何在内存中存放问题
- 如何使用TestFlight进行App构建版本测试
- 日历游戏
- 构造函数的强制调用
- Atitit r2017 r5 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0-D3C8 D:\ati\r2017 v4 r
- 【MongoDB+docker】docker 配置 mongodb 复制集
- dwz框架常用记录
- 基于SnapDragonBoard410c的远程防盗系统 (二)
- MySQL 主从复制详解(详细)
- 关于性能优化问题的探究
- LeetCode 46. Permutations
- [JAVA]单元测试:从零开始的JUnit之路(Elicpse/IDEA)