网络编程
位置:首页>> 网络编程>> JavaScript>> 浅谈javascript面向对象编程(3)

浅谈javascript面向对象编程(3)

作者:oldfish 来源:Alipay UED 发布时间:2009-03-03 12:04:00 

标签:封装,继承,多态,闭包,面向对象,javascript

多态:个人觉得这个比较抽象,很难言传,所以下面就从重载和覆盖两个方面来简单阐述一下。

重载:上面这个例子中agument函数初始带了两个参数,但是在后面的调用中,agument(Fish,Name,”sayLove”)同样可以带入任意多个参数,javascript的重载,是在函数中由用户自己通过操作arguments这个属性来实现的。

覆盖:这个很简单,就是子类中定义的方法如果与从超类中继承过来的的方法同名,就覆盖这个方法(这里并不是覆盖超类中的方法,注意一下),这里就不累赘了!

最后重点着墨说一下this和执行上下文,在前面举的封装例子中,this都是表示this所在的类的实例化对象本身,但是并不是千篇一律的,打个比方,通过HTML属性定义的事件处理代码,见如下代码:


<script type="text/javascript"> 
 var Name = function(name) { 
  this.name = name; 
  this.getName = function () { 
   alert(this.name); 
  } 
 }; 
   var ioldFish = new Name("老鱼"), 
   btn = document.getElementById('btn'); 
   btn.onclick = ioldFish.getName; 
   //btn.onclick = function(){ioldFish.getName.call(ioldFish)}; 
</script>

上例中点了按钮以后弹出框里并没有显示出实例对象的属性,这是因为this的执行上下文已经改变了,他现在所在的上下文应该是input这个HTML标签,但是该标签又不存在getName这个属性,所以自然无法输出这个属性的属性值了!从这个例子我们不难看出:执行上下文是在执行时才确定的,它随时可以变。

当然你可以去掉上面我注释掉的那段代码,通过call改变this的执行上下文,从而获取getName方法。apply方法同样可以实现改变执行上下文的功能,不过在prototype框架中发现了一个更为优美的实现方法bind。看一下这个方法的实现吧,不得不感叹先人的伟大……

Function.prototype.bind = function(obj) { 
  var method = this, 
   temp = function() { 
    return method.apply(obj, arguments); 
   }; 
 }

相信如果能看明白的话,您已经可以靠这些知识点,去写一个简单的脚本框架了,多多实践,相信不久的将来就能高手进级了!如果没看明白,也不用着急,面向对象本来就有些抽象,多练习练习,应该OK的了,加油……

这篇先写到这吧,下篇文章可以和大家一起探讨一下,javascript的设计模式,敬请期待。
 

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com