使用隐藏的new来创建对象

发布于 2022-09-30 19:37:25 字数 3204 浏览 9 评论 0

转:Snandy

使用隐藏的new来创建对象

JQ中发现的,jQuery.Event类。估计作者是为了减少代码量。定义一个类,但不用new关键字去创建该类对象,而使用方法调用()方式去创建该对象。

很多时候我们是这样写类,然后使用new创建对象的。

  1. 1 function Person(name,age){  
  2. 2     this.name=name;  
  3. 3     this.age=age;  
  4. 4 }  
  5. 5 Person.prototype={  
  6. 6     setName : function(n){this.name=n;},  
  7. 7     getName : function(){return this.name;}  
  8. 8 }  
  9. 9 var p = new Person('jack',25);

复制代码改成这样的

  1. 01 function Person(name,age){  
  2. 02    //条件改为(this==window)或(this==self)或(this.constructor!=Object)  
  3. 03     if(!this.setName){  
  4. 04        return new Person(name,age);  
  5. 05     }  
  6. 06     this.name=name;  
  7. 07     this.age=age;  
  8. 08 }  
  9. 09 Person.prototype={  
  10. 10     setName : function(n){this.name=n;},  
  11. 11     getName : function(){return this.name;}  
  12. 12 }  
  13. 13 var p = Person('jack',25);

复制代码注意该类较最上面的写类方式中多了以下

  1. 1 if(!this.setName){  
  2. 2     return new Person(name,age);  
  3. 3 }

复制代码好,创建类的实例(对象)方式也变成了如下

  1. 1 var p = Person('jack',25);

复制代码这种创建方式(函数调用)较上面的少了“new_”,new和空格,实际上是在类内部new了。而这样方式每次创建对象可以减少4个byte。
如果把类内部的if判断条件换成非prototype上的属性,如this.name。程序会提示出错:too much recursion

  1. 01 function Person(name,age){  
  2. 02     if(!this.name){  
  3. 03        return new Person(name,age);  
  4. 04     }  
  5. 05     this.name=name;  
  6. 06     this.age=age;  
  7. 07 }  
  8. 08 Person.prototype={  
  9. 09     setName : function(n){this.name=n;},  
  10. 10     getName : function(){return this.name;}  
  11. 11 }  
  12. 12 var p = Person('jack',25);

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文