javascript 构造函数强制调用经验总结
2012-12-02 00:00
405 查看
兴致勃勃地定义了下面这么个构造函数:
定义构造函数结束后呢?没错,赶紧实例化:
var coder = Coder( 'casper' );
这个coder兄弟叫什么名字?赶紧打印下:
关于this指针的指向问题不是本文讨论的内容,可以参考下犀牛书相关章节
这样的错误貌似挺低级的,但出现的概率挺高的,肿么去避免或减少这种情况的发生呢?
可以在内部实现里面动下手脚:
其实很简单,实例化的时候,内部判断下,当前this指向的对象的类型即可,如果非当前构造函数的类型,强制重新调用一遍构造函数。
突然觉得Coder这名字不够洋气?想用Hacker,好吧,我改。。。数了下,一共有三处要改,这不科学,有没有办法只把构造函数的名字改了就行?
当然有:
tips:据说在ES 5的严格模式下面arguments.callee会被禁用,不过仅当ES 5普及同时你指定了要使用严格模式,否则还是可以用的发散下思维:在JQ里面包打天下所向披靡的$,大家都知道它会返回一个jquery对象,如下:
var jObject = $('#node_id');
有没有发现,这里同样没有new!应该猜到怎么回事了吧。原理是差不多的,不过里面的实现要复杂得多,有空再把JQ里面的实现拔下写下总结
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 构造函数强制调用经验总结
- 【经验总结】构造函数的强制调用
- [C/C++不常见语法特性]_[强制显式调用构造函数explicit]
- [Effective JavaScript 笔记]第18条:理解函数调用、方法调用及构造函数调用之间的不同
- Effective JavaScript Item 38 在子类构造函数中调用父类构造函数
- Javascript和CSS浏览器兼容性方面经验总结
- 用javascript操作VML对象的一些经验总结
- [经验总结]调用WinSock的closesocket函数出现死锁的解决办法
- JavaScript学习总结(二十)——Javascript非构造函数的继承
- JavaScript中具名函数的多种调用方式总结
- JavaScript核心:对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域链 闭包 This 总结
- 经验总结-1-不同类之间调用彼此方法的几种情况
- asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
- Android中WebView的使用总结及Java与Javascript的相互调用
- 在.NET中调用Oracle9i存储过程经验总结(转)
- Yycom项目经验总结(ASP与JAVASCRIPT)
- javascript学习心得及经验总结
- javascript 前端学习经验总结
- Javascript中函数调用与this所指对象关系进行了一下总结
- JavaScript 父子页面相互调用总结