`
katelin
  • 浏览: 30062 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

瞒天过海法处理父类构造函数带参数

阅读更多
这个方法以前从某个贴子上学的。但是只知道是那样用,不知道是为啥。我今天忽然明白了。以前一直奉行拿来主义,不求甚解( ̄▽ ̄)~* 。。太丢人了。。下面写一下我的理解,希望大家不要觉得我罗嗦


当父类的构造函数带参数时如何处理。我们先避开这个问题,看一下一个简单的类:

例1:
<SCRIPT LANGUAGE="JavaScript">
<!--
    function MyClass(){
      this.name = 'my defined class';
      this.myMethod = myOuterMethod;
    }

    function myOuterMethod(){
      alert(this.name); //这里的this, 即是MyClass的实例。这点很关键喔。
    }

    var mc = new MyClass();
    mc.myMethod(); //打印 'my defined class'

//-->
</SCRIPT>



类MyClass里定义了myMethod方法,它指向一个外部定义的函数(姑且这么叫)myOuterMethod。
当用MyClass的实例来调用这个myMethod方法时,可以发现myOuterMethod里的this其实就是MyClass的实例。

这个例子很好理解吧^_^。那么再看例2。。

例2:
<SCRIPT LANGUAGE="JavaScript">
  function Parent(id){
    this.id = id;
    this.getLocation = function(){
      alert(this.id + ' at XiaMen');
    }
  }

  Parent.prototype.getId = function(){
    alert(this.id);
  }

  function Child(id){
    /**就像上面MyClass里的myMethod属性指向myOuterMethod方法那样。指向Parent函数*/
    this._super = Parent;
     /**执行这个方法.这个时候Parent函数 (注意它现在是函数)里的this为Child类的实例!*/
     this._super(id); 	
   }

   Child.prototype = new Parent(); //继承

    var c1 = new Child('katelin');
    c1.getLocation(); // 打印 'katelin at XiaMen'
    c1.getId(); // 打印 'katelin'
//-->
</SCRIPT>



想让Parent里的属性变成自己的属性。例1的方法给了我们瞒天过海的启示~ 在Child类里令一个属性_super(随便取名的啦)指向父类的Parent方法。请对比下例1。这时_super就像myMethod, Parent就像myOuterMethod. 因此用Child的实例来调用_super方法时,Parent里面的this指的就是Child的实例~

因此我们执行this._super(id)的时候, Parent方法里的this.id, this.getLocation就这么变成了Child实例的囊中之物了∩__∩y 。但是, 相信大家已经看明白了,这仅限与写在Parent方法里的属性和方法喔(听着好怪)。


如果要继承写在Parent外面的方法,比如getId,那就得用Child.prototype = new Parent();这个就不说了。大家都知道得~
分享到:
评论
2 楼 katelin 2007-10-09  
afcn0我明白你的意思。^_^。当然也可以用

<SCRIPT LANGUAGE="JavaScript">  
  function Parent(id){   
    this.id = id;   
    this.getLocation = function(){   
      alert(this.id + ' at XiaMen');   
    }   
  }   
  
  Parent.prototype.getId = function(){   
    alert(this.id);   
  }   
  
  function Child(id){
    /**这里的this会替换Parent里的this*/
	Parent.apply(this, arguments);  
  }   
  
  Child.prototype = new Parent(); //继承   
  
  var c1 = new Child('katelin');   
  c1.getLocation(); // 打印 'katelin at XiaMen'   
  c1.getId(); // 打印 'katelin'   
//-->  
</SCRIPT> 
1 楼 afcn0 2007-10-08  
就是修改函数执行的context而已,其实完全可以Parent.call(this,id)一句话替代_super的,js执行过程函数动态的context和scope就是js的特色

相关推荐

    瞒天过海--偷换概念的诡辩.doc

    瞒天过海--偷换概念的诡辩.doc

    房地产兵法论专集之十三-瞒天过海.docx

    房地产兵法论专集之十三-瞒天过海.docx

    电源技术中的电脑电源的技术参数

    1.功率  功率当然是电源的首要指标,也是许多人所知道的惟一指标。现在Prescott核心的:Pentium 4电脑功耗...这为保证电源长期可靠工作提供了保障,但也正因此,许多劣质电源得以瞒天过海,它们都敢标注挺大的功率,

    简单理解JVM垃圾回收

    1.引用计数法: 一旦相互持有引用,就导致对象永远没法被回收 例如: 给对象定义一个引用计数器,当该对象被引用时该计数器就++,引用结束时就–。那么当垃圾回收时就会回收掉计数器为0的对象。 那么就有个问题,...

    前端性能优化方法与实战

    01 体系总览:性能优化体系及关键指标设定.md │ 02 性能瓶颈点:从 URL 输入到页面加载整过程分析.md │ 03 案例分析:移动端 M 站性能优化落地...│ 14 高级进阶:瞒天过海的骨架屏及 SSR 优化手段.md │ 15 高级进阶

    IOT安全三十六计.pdf

    Agenda · 瞒天过海 · ⽆中⽣有 · 反间计 · GeekPwn分享 IOT安全中的一些小技巧,包括一个硬件潜在的攻击面、静态分析和动态调试的技巧以及一些实例展示

    无赖小子Wayv2.4(远程控制)源代码

    21、加密后的程序只不过是来帮木马、病毒之类的瞒天过海,运行后当然会原形毕露,也只能做到这一步 22、所以要先配置服务端后再进行EXE捆绑才有效 23、配置服务断程序端口请用1024-65535之间的端口,以免冲突 ...

    Way v2.4 (远程控制)

    12、EXE处理器:帮你的木马瞒天过海,帮你的EXE文件进行捆绑,加密,更换图标; 13、服务断配置:可更改端口、密码IP通知采用Email通知和客户端内置服务器侍待两种通知方式,Email通知将你的动态IP和密码星星等发走...

    iOS利用UIScrollView实现无限滚动效果

    它的原理是在要显示的图片前后各加一张图片即在第一张图片之前放最后一张图片,在最后一张图片之后放第一张图片,然后在滚动到边缘的时候,巧妙的过渡一下就可以”瞒天过海”,”以假乱真”的造成无限滚动的假象。...

    pano2vr全景图制作教程

    pano2vr全景图制作教程,网络资源,按流程能制作简单的全景图

Global site tag (gtag.js) - Google Analytics