龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

探讨JavaScript:优雅的封装还是执行效率?(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
2. 去看效率 那种封装虽然优雅,但是很浪费。好在JavaScript是一种灵活的语言,于是,我们马上想到,把这些函数的指针指向另外的一个函数不就可以了吗

2. 去看效率

那种封装虽然优雅,但是很浪费。好在JavaScript是一种灵活的语言,于是,我们马上想到,把这些函数的指针指向另外的一个函数不就可以了吗?

  1. function show() {     
  2.     alert("I'm a person.");     
  3. }     
  4. function Person() {     
  5.     this.show = show;     
  6. }     
  7. var p1 = new Person();     
  8. var p2 = new Person();     
  9. alert(p1.show == p2.show); // true    
  10.  
  11. function show() {  
  12.     alert("I'm a person.");  
  13. }  
  14. function Person() {  
  15.     this.show = show;  
  16. }  
  17. var p1 = new Person();  
  18. var p2 = new Person();  
  19. alert(p1.show == p2.show); // true  

这个办法不错,解决了我们以前的那个问题:不同的对象共享了一份代码。但是这种实现虽然有了效率,可是却太不优雅了——如果有很多类,那么岂不是有很多全局函数?

好在JavaScript中还有一个机制:prototype。还记得这个prototype吗?每个对象都维护着一个prototype属性,这些对象的prototype属性是共享的。那么,我们就可以把函数的定义放到prototype里面,于是,不同的对象不就共享了一份代码拷贝吗?事实确实如此:

  1. function Person() {     
  2. }     
  3. Person.prototype.show = function() {     
  4.     alert("I'm a person.");     
  5. }     
  6. var p1 = new Person();     
  7. var p2 = new Person();     
  8. alert(p1.show == p2.show); // true    
  9.  
  10. function Person() {  
  11. }  
  12. Person.prototype.show = function() {  
  13.     alert("I'm a person.");  
  14. }  
  15. var p1 = new Person();  
  16. var p2 = new Person();  
  17. alert(p1.show == p2.show); // true  

不过,这种分开定义看上去很别扭,那么好,为什么不把函数定义也写到类定义里面呢?

  1. function Person() {        
  2.     Person.prototype.show = function() {        
  3.         alert("I'm a person.");        
  4.     }        
  5. }        
  6. var p1 = new Person();        
  7. var p2 = new Person();        
  8. alert(p1.show == p2.show); // true       
  9.  
  10. function Person() {     
  11.     Person.prototype.show = function() {     
  12.         alert("I'm a person.");     
  13.     }     
  14. }     
  15. var p1 = new Person();     
  16. var p2 = new Person();     
  17. alert(p1.show == p2.show); // true   

实际上这种写法和上面一种没有什么不同:唯一的区别就是代码位置不同。这只是一个“看上去很甜”的语法糖,并没有实质性差别。

最初,微软的.Net AJAX框架使用前面的机制模拟了私有变量和函数,这种写法和C#很相像,十分的优雅。但是,处于效率的缘故,微软后来把它改成了这种原型的定义方式。虽然这种方式不那么优雅,但是很有效率。

在JavaScript中,这种封装的优雅和执行的效率之间的矛盾一直存在。现在我们最好的解决方案就是把数据定义在类里面,函数定义在类的prototype属性里面。

原文链接:http://devbean.javaeye.com/blog/412296

精彩图集

赞助商链接