锁定老帖子 主题:使用隐藏的new来创建对象
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-07
最后修改:2010-04-21
JQ中发现的,jQuery.Event类。估计作者是为了减少代码量。定义一个类,但不用new关键字去创建该类对象,而使用方法调用()方式去创建该对象。
多数时候我们是这样写类,然后使用new创建对象的。
function Person(name,age){ this.name=name; this.age=age; } Person.prototype={ setName : function(n){this.name=n;}, getName : function(){return this.name;} } var p = new Person('jack',25);
改成这样的 function Person(name,age){ //条件改为(this==window)或(this==self)或(this.constructor!=Object) if(!this.setName){ return new Person(name,age); } this.name=name; this.age=age; } Person.prototype={ setName : function(n){this.name=n;}, getName : function(){return this.name;} } var p = Person('jack',25); 注意该类较最上面的写类方式中多了以下
if(!this.setName){ return new Person(name,age); } 好,创建类的实例(对象)方式也变成了如下:
var p = Person('jack',25);
这种创建方式(函数调用)较上面的少了“new_”,new和空格,实际上是在类内部new了。而这样方式每次创建对象可以减少4个byte。
如果把类内部的if判断条件换成非prototype上的属性,如this.name。程序会提示出错:too much recursion
function Person(name,age){ if(!this.name){ return new Person(name,age); } this.name=name; this.age=age; } Person.prototype={ setName : function(n){this.name=n;}, getName : function(){return this.name;} } var p = Person('jack',25);
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-07
呵呵,学到了,省的字节虽然少,不过对于追求极致的人来说,还是有用的,对prototype的执行顺序真是理解深刻...
|
|
返回顶楼 | |
发表时间:2010-04-08
这个判断有缺陷
if(!this.setName){ return new Person(name,age); } 如果全局有个setName属性或者方法,这个判断就会失效。 |
|
返回顶楼 | |
发表时间:2010-04-08
weiqingfei 写道 这个判断有缺陷 if(!this.setName){ return new Person(name,age); } 如果全局有个setName属性或者方法,这个判断就会失效。 感谢提醒,但这是为什么呢?即使加了一次闭包仍然失效。 |
|
返回顶楼 | |
发表时间:2010-04-08
直接调用Person方法时,这儿的this指的是window,只有在new Person的时候,this才指的是Person的一个实例,原本这儿就是为了判断是直接调用,还是在new。但是当window里也有这个方法或者属性的时候,就失效了。
|
|
返回顶楼 | |
发表时间:2010-04-09
weiqingfei 写道 直接调用Person方法时,这儿的this指的是window,只有在new Person的时候,this才指的是Person的一个实例,原本这儿就是为了判断是直接调用,还是在new。但是当window里也有这个方法或者属性的时候,就失效了。
说的有道理。 把条件改成以下就可以了,不怕同名的全局函数了。 1,this==window 2,this===window 3,this==self 4,this!=Object |
|
返回顶楼 | |
发表时间:2010-04-09
个人感觉,这个会导致思路上混乱。
|
|
返回顶楼 | |
发表时间:2010-04-09
zhouyrt 写道 weiqingfei 写道 直接调用Person方法时,这儿的this指的是window,只有在new Person的时候,this才指的是Person的一个实例,原本这儿就是为了判断是直接调用,还是在new。但是当window里也有这个方法或者属性的时候,就失效了。
说的有道理。 把条件改成以下就可以了,不怕同名的全局函数了。 1,this==window 2,this===window 3,this==self 4,this!=Object 有时候,这个方法的声明,不一定会放在全局(也就是window)上,所以我觉得如果是内部使用的话也就算了,开放给用户用的话不大合适。 |
|
返回顶楼 | |
发表时间:2010-04-09
没意义,还会是代码的可读性变差。
|
|
返回顶楼 | |
发表时间:2010-04-09
还有一个问题就是,这种写法会带来call与apply方法的不正确运行
|
|
返回顶楼 | |