对于javascript大家大部分时间用来做效果,但却忽视了最基础的东西,
当大家把javascript基本功学扎实了,我认为对以后写出漂亮的js代码有很大的帮助,
今天就总结下我对javascript关于面向对象方面的理解
首先总结一下javascript中的"类",
第一种算是比较灵活的方式了,成为工厂定义方式
- var obj=new Object;
- obj.color='red';
- obj.dodo=function(){...};
为什么说它灵活,就是因为它可以在实例化对象后,可以对该对象增加属性,可以完善我们的需求,
我们经常会得到实例化的对象比如:=var aa=document.getElementById('lover'),此时我们可以很方便的增加各种方法属性,
aa.onclick=function(){...};aa.lover='i love you ';等,以至传递的时候只需要传递该对象;
- <script language= "javascript">
- var obj=new Object;
- obj.color='red';
- obj.dodo=function(){alert('aa')};
- for(aa in obj)
- {
- alert(aa);
- }
- </script>
javascript中定义类我们平时都是按照这种方式,因为毕竟和java和c#比较接近,
- function Car(scolor,snum)
- {
- this.color=scolor;
- this.dodo=function(){alert('aa')};
- }
- var obj=new Car('yellow',30);
- for(aa in obj)
- {
- alert(aa);
- }
上面不用多介绍大家是最熟悉的了,
接下来介绍原型方式:
什么是原型,关于具体的概念大家可以查看资料,不想说太多,只想举例子来说明,
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.color=scolor;
- this.dodo=function(){alert('aa')};
- }
- Car.prototype.getValue = function (){
- return this.color;
- }
- Car.prototype.setValue = function (value){
- this.color = value;
- }
- var obj=new Car('yellow',30);
- obj.setValue(666);
- alert(obj.getValue());
- for(aa in obj)
- {
- alert(aa);
- }
- </script>
可以看到利用原型可以为对象增加属性和方法,具体为什么要利用原型来操作,概念性的问题可以查资料,
但是有一点需要注意的是:
- <script language= "javascript">
- function Car(scolor,snum)
- {
- }
- Car.prototype.cc = "cccc"
- Car.prototype.docc = function (){alert(this.cc)}
- var obj=new Car('yellow',30);
- for(aa in Car.prototype)
- {
- alert(aa);
- }
- alert(obj.cc);
- obj.docc();
- </script>
虽然同样是给对象增加了cc属性和docc方法,但是查找顺序是先查找构造函数中是否有该属性和方法,
没有再搜索propertype,根据
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.cc="cc";
- this.docc=function(){alert(this.cc)}
- }
- Car.prototype.cc = "cccc"
- Car.prototype.docc = function (){alert(this.cc)}
- var obj=new Car('yellow',30);
- alert(obj.cc);
- delete obj.cc;
- alert(obj.cc);
- obj.docc();
- delete obj.docc();
- obj.docc();
- </script>
可以看到首先删除两个属性仍然可以输出属性值,并且第一个obj.docc()获取的是原型中的cc属性值
看下面的例子:
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.cc="cc";
- }
- Car.prototype.cc = "cccc"
- Car.prototype.docc = function (){alert(this.cc)}
- var obj=new Car('yellow',30);
- Car.prototype.docc();
- </script>
可以直接调用原型方法,调用的是原型中的cc属性而不是构造函数的,
如果没有定义原型cc属性,就会显示undefined,在直接调用原型方法时这是需要注意的地方
再然后介绍一下javascript静态的实现方法:
- <script language= "javascript">
- function Car()
- {
- Car.docc = function (){alert('cc')}
- }
- Car.docc = function (){alert('cccc')}
- Car.docc();
- var obj=new Car();
- Car.docc();
- </script>
在了解以上基本概念以后,接下来介绍一下javascript如何实现继承,
我们知道所有的对象都是继承objec类,而javascript中是怎样继承了object类呢?
其实在javascript中隐藏了
- Car.prototype = new Object();
作用是什么呢?很明显Object中有toString()方法,
这样
- Car.paopertype.toString()=function(){...}
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.cc="cc";
- }
- alert(Car.toString());
- </script>
上面的例子不是太贴切,我补充一个大家看看
- <script language= "javascript">
- function obj()
- {
- this.aa='aa';
- this.bb=function(){alert('==========')};
- }
- function Car()
- {
- this.cc="cc";
- }
- Car.prototype = new obj();
- var aa=new Car();
- for(a in aa)
- {
- alert(a);
- }
- aa.bb();
- for(b in Car.prototype)
- {
- alert(b);
- }
- </script>
这样大家就能明白
- Car.prototype = new obj();
这句话的含义了。
接下来又引出一个重要属性,constructor,
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.cc="cc";
- }
- alert(Car.prototype.constructor);
- </script>
再看下面
- <script language= "javascript">
- function Car(scolor,snum)
- {
- this.cc="cc";
- }
- Car.prototype.cc = "cccc"
- Car.prototype.docc = function (){alert(this.cc)}
- alert(Car.prototype.constructor.prototype.cc);
- Car.prototype.constructor.prototype.docc();
- alert(Car.prototype.constructor===Car);
- </script>
大家看结果明白了吧
还有让大家比较头疼的问题就是call和apply的用法,
首先给大家做个解释,
- function classA(scolor){
- this.docc=function(){...}
- }
- function classB(){
- 一句this.newMethod(scolor);函数调用,就将classA中的关于this.的方法和属性就都归classB,因为此时classA中的
- this指针在classB内部指向的就是classB本身,所以这也是实现继承的一种手段,
- classA.call(this,scolor);
- }
完整的例子:
- <script language= "javascript">
- function classA(scolor){
- this.cc=scolor;
- this.docc=function(){alert(this.cc)}
- }
- function classB(){
- classA.call(this,"yellow");
- }
- var obj=new classB();
- alert(obj.cc)
- obj.docc();
- </script>
此时大家想原型方法能够继承吗?其实就按照我上面的解释,大家也该明白函数调用this.newMethod(scolor)只调用函数本身,就象我们平时使用函数一样,不会牵扯到原型上去,所以
- <script language= "javascript">
- function classA(scolor){
- this.cc=scolor;
- this.docc=function(){alert(this.cc)}
- }
- classA.prototype.dd = "dddd"
- classA.prototype.dodd = function (){alert(this.dd)}
- function classB(){
- classA.call(this,"yellow");
- }
- var obj=new classB();
- alert(obj.dd)
- obj.dodd();
- </script>
那我们怎么办呢?很简单,只要仔细看了我上面的介绍,
- <script language= "javascript">
- function classA(scolor){
- this.cc=scolor;
- this.docc=function(){alert(this.cc)}
- }
- classA.prototype.dd = "dddd"
- classA.prototype.dodd = function (){alert(this.dd)}
- function classB(){
- }
- classB.prototype = new classA("yellow");
- var obj=new classB();
- alert(obj.cc)
- obj.docc();
- alert(obj.dd)
- obj.dodd();
- </script>
我再给大家举个合用的例子
- <script language= "javascript">
- function classA(scolor){
- this.cc=scolor;
- this.docc=function(){alert(this.cc)}
- }
- classA.prototype.dd = "dddd"
- classA.prototype.dodd = function (){alert(this.dd)}
- function classB(){
- classA.call(this,"red");
- }
- classB.prototype = new classA("yellow");
- var obj=new classB();
- alert(obj.cc)
- obj.docc();
- alert(obj.dd)
- obj.dodd();
- </script>
为什么会是red不是yellow原因很简单,一个是在构造函数内实现了继承,一个是原型继承,而我们说过构造函数在
原型之前调用,所以会出现red而不是yellow。
最后借助风之石写的一个例子结束此次文章:
- <html>
- <body>
- <button id=btTest>test</button>
- </body>
- </html>
- <script>
- if(!document.all){
- HTMLElement.prototype.attachEvent=function(sType,foo){
- this.addEventListener(sType.slice(2),foo,false)
- }
- }
- Function.prototype.bindNode=function(oNode){
- var foo=this,iNodeItem
-
- if(window.__bindNodes==null)
- __bindNodes=[]
- __bindNodes.push(oNode)
- iNodeItem=__bindNodes.length-1
-
- oNode=null
- return function(e){
- foo.call(__bindNodes[iNodeItem],e||event)
-
- }
- }
- abc()
- function abc(){
- var bt=document.getElementById("btTest")
- bt.attachEvent("onclick",function(){
-
- alert(this.tagName)
- }.bindNode(bt))
-
- bt=null
- }
- </script>
大家可以自己回味一下call的用法,不明白或者有错误可以在回复中指出,匆匆忙忙写完一定会有不足之处,
请指教