JavaScript代码复用模式
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:itlead 阅读 1577
任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免
  任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少有带来一些问题;第二排是推荐篇,指的是推荐大家使用的模式,一般不会有什么问题。
  
  模式1:默认模式
  
  代码复用大家常用的默认模式,往往是有问题的,该模式使用Parent()的构造函数创建一个对象,并且将该对象赋值给Child()的原型。我们看一下代码:
  
  function inherit(C, P) {    C.prototype = new P();}
  // 父构造函数function Parent(name) {    this.name = name || 'Adam';}
  // 给原型添加say功能Parent.prototype.say = function () {    return this.name;};
  // Child构造函数为空function Child(name) {}
  // 执行继承inherit(Child, Parent);var kid = new Child();console.log(kid.say());
  // "Adam"var kiddo = new Child();kiddo.name = "Patrick";console.log(kiddo.say());
  // "Patrick"// 缺点:不能让参数传进给Child构造函数var s = new Child('Seth');console.log(s.say());
  // "Adam"这种模式的缺点是Child不能传进参数,基本上也就废了。
  
  
  模式2:借用构造函数
  
  该模式是Child借用Parent的构造函数进行apply,然后将child的this和参数传递给apply方法:
  
  // 父构造函数function Parent(name) {    this.name = name || 'Adam';}
  // 给原型添加say功能Parent.prototype.say = function () {    return this.name;};
  // Child构造函数function Child(name) {    Parent.apply(this, arguments);}var kid = new Child("Patrick");console.log(kid.name);
  // "Patrick"// 缺点:没有从构造函数上继承say方法console.log(typeof kid.say);
  // "undefined"缺点也很明显,say方法不可用,因为没有继承过来。
  
  模式3:借用构造函数并设置原型
  
  上述两个模式都有自己的缺点,那如何把两者的缺点去除呢,我们来尝试一下:
  
  // 父构造函数function Parent(name) {    this.name = name || 'Adam';}// 给原型添加say功能Parent.prototype.say = function () {    return this.name;};// Child构造函数function Child(name) {    Parent.apply(this, arguments);}Child.prototype = new Parent();var kid = new Child("Patrick");console.log(kid.name); // "Patrick"console.log(typeof kid.say); // functionconsole.log(kid.say()); // Patrickconsole.dir(kid);delete kid.name;console.log(kid.say()); // "Adam"运行起来,一切正常,但是有没有发现,Parent构造函数执行了两次,所以说,虽然程序可用,但是效率很低。
  
  模式4:共享原型
  
  共享原型是指Child和Parent使用同样的原型,代码如下:
  
  
  模式5:临时构造函数
  
  首先借用构造函数,然后将Child的原型设置为该借用构造函数的实例,最后恢复Child原型的构造函数。代码如下:
  
  
  看着是不是有点晕,说好点,该模式的语法和规范拧得和别的语言一样,你愿意用么?
  
  总结
  
  以上六个模式虽然在某种特殊情况下实现了某些功能,但是都存在各自的缺点,所以一般情况,大家要避免使用。
  
联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2