快速业务通道

[探讨]JavaScript面向对象编程

作者 佚名技术 来源 互联网 浏览 发布时间 2012-01-13

通用上面这个示例,我们可以看到,Person 里的属性并没有被真正复制到了 Student 中来,但是我们可以去存取。这是因为 Javascript 用委托实现了这一机制。其实,这就是 Prototype,Person 是 Student 的 Prototype。

当我们的代码需要一个属性的时候,Javascript 的引擎会先看当前的这个对象中是否有这个属性,如果没有的话,就会查找他的 Prototype 对象是否有这个属性,一直继续下去,直到找到或是直到没有 Prototype 对象。

为了证明这个事,我们可以使用 Object.getPrototypeOf ()来检验一下:

  1. Student.name = 'aaa';  
  2.    
  3. //输出 aaa  
  4. document.write('<p>' + Student.name + '</p>');  
  5.    
  6. //输出 Chen Hao  
  7. document.write('<p>' +Object.getPrototypeOf(Student).name + '</p>'); 

于是,你还可以在子对象的函数里调用父对象的函数,就好像 C++ 里的 Base::func () 一样。于是,我们重载 hello 的方法就可以使用父类的代码了,如下所示:

  1. //新版的重载SayHello方法  
  2. Student.sayHello = function (person) {  
  3.     Object.getPrototypeOf(this).sayHello.call(this);  
  4.     var hello = "my student no is: " + this. no + ", <br>" +  
  5.                 "my departent is: " + this. dept;  
  6.     document.write(hello + '<br>');  

这个很强大吧。

组合

上面的那个东西还不能满足我们的要求,我们可能希望这些对象能真正的组合起来。为什么要组合?因为我们都知道是这是 OO 设计的最重要的东西。不过,这对于 Javascript 来并没有支持得特别好,不好我们依然可以搞定个事。

首先,我们需要定义一个 Composition 的函数:(target 是作用于是对象,source 是源对象),下面这个代码还是很简单的,就是把 source 里的属性一个一个拿出来然后定义到 target 中。

  1. function Composition(target, source)  
  2. {  
  3.     var desc  = Object.getOwnPropertyDescriptor;  
  4.     var prop  = Object.getOwnPropertyNames;  
  5.     var def_prop = Object.defineProperty;  
  6.    
  7.     prop(source).forEach(  
  8.         function(key) {  
  9.             def_prop(target, key, desc(source, key))  
  10.         }  
  11.     )  
  12.     return target;  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号