2--理解并学习javascript中的面向对象(OOP)(续)

来源:互联网 发布:诺基亚n8刷windows 编辑:程序博客网 时间:2024/06/06 02:13

2.下面部分代码,是从另外一个角度讲解javascript中的面向对象编程。是借鉴EasyJF开源团队的讲解,我个人做了一些补充和说明。

[html] view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <title>javascript面向对象编程</title>  
  5.     <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>  
  6.     <script type="text/javascript">  
  7.         $(function () {  
  8.   
  9.             //            function animal(name) {  
  10.             //                this.name = name;  
  11.             //                this.age = 0;  
  12.             //            }  
  13.             //            var a1 = animal;  
  14.             //            alert(a1);//弹出整个函数体  
  15.             //            var a2 = animal("dinglang");  
  16.             //            alert(a2); //弹出undefined  
  17.             //            var a3 = new animal();  
  18.             //            alert(a3);//弹出object  
  19.             //            var a4 = new animal;  
  20.             //            alert(a4);//弹出object  
  21.   
  22.   
  23.             //求值  
  24.             //alert(sum(1, 3)); //要求弹出结果为4  
  25.             // alert(sum(1, 3, 5, 4, 7)); //要求弹出结果为20  
  26.             //根据java或者C#的编程经验,首先想到的是函数重载。  
  27.             //            function sum(a, b) {  
  28.             //                return a + b;  
  29.             //            }  
  30.             //            function sum(a, b, c, d, e) {  
  31.             //                return a + b + c + d + e;  
  32.             //            }  
  33.             //不幸的是,javascript并不支持函数重载。如果照上面那么写,只有下面的那个函数才会生效  
  34.   
  35.             //javascript支持可变参数的函数  
  36.             function sum() {  
  37.   
  38.                 var n = 0;  
  39.                 for (var i = 0; i < arguments.length; i++) {  
  40.                     n += arguments[i];  
  41.                 }  
  42.                 return n;  
  43.             }  
  44.   
  45.             //javascript高级知识 -- 闭包  
  46.             //函数里面嵌套函数,且在外部被引用了,所以这个对象i不会被垃圾回收机制清除,所以i递增  
  47.             function f1() {  
  48.                 var i = 0;  
  49.                 var f2 = function () {  
  50.                     i++;  
  51.                     alert(i);  
  52.                 }  
  53.                 return f2; //f2对象指的是整个函数体  
  54.             }  
  55.             var f3 = f1(); // "f1()"就是指该函数的执行结果或者返回值 --f2  
  56.             //           f3();//1  
  57.             //            f3();//2  
  58.             //            f3();//3  
  59.   
  60.   
  61.             //作用域与this关键字  
  62.             //            var obj = new Object();  
  63.             //            obj.v = "v is a object";  
  64.             //            //相当于这么写  
  65.             //           var obj2 = { v: "v is a object" };  
  66.             //作用域Scope  
  67.             var b1 = { v: "this is b1" };  
  68.             var b2 = { v: "this is b2" };  
  69.             function b(x, y) {  
  70.                 //  alert(this.v + "," + x + "," + y);  
  71.             }  
  72.             b("ding", "lang"); //undefined,"ding","lang"   
  73.             //调用b函数时,b函数中的this关键字指的是window对象.而Window对象中没有v对象,所以undefined  
  74.             //window.b("ding", "lang"); //undefined,"ding","lang"   --与 b("ding", "lang");意义相同  
  75.             //b.call();//就等于b();  
  76.             //call函数的第一个参数表示的是函数的上下文 --表示b函数中的this 所以this关键字=b1  
  77.             // b.call(b1, "ding", "lang"); //this is b1,ding,lang  
  78.             //注意apply函数的用法:第一个参数表示的也是函数中的上下文。不过后面的参数要以数组的形式传递  
  79.             // b.apply(b2, ["ding", "lang"]); // //this is b1,ding,lang  
  80.   
  81.             //关于作用域,再补充一点  
  82.             var b3 = { v: "this is b3",  
  83.                 sayHello: function () {  
  84.                     alert(this.v);  
  85.                 }  
  86.             }  
  87.             // b3.sayHello(); //this is b3  
  88.             //b3.sayHello.call(b1); //会调用b1对象中的sayHello函数  -- this is b1  
  89.   
  90.   
  91.             // for ... in  
  92.             //            var arr = new Array(); //new 一个js数组,与c#、java等编程语言不同,可以不指定长度  
  93.             //            arr[0] = 1; //赋值  
  94.             //            arr[1] = 2;  
  95.             //            arr[2] = 3;  
  96.             //javascript支持直接定义赋值  
  97.             var arr = new Array(1, 2, 3);  
  98.             for (var i = 0; i < arr.length; i++) {  
  99.                 // alert(arr[i]); //弹出 1,2 ,3   
  100.             }  
  101.             //注意:javascript中的for...in ,看起来与C#或者java中的foreach类似,但是不同  
  102.             for (var key in arr) {  
  103.                 // alert(key);// 弹出0,1,2   key指的是键,而不是值。在C#的foreach中,“in”前的变量指的是值  
  104.                 //alert(arr[key]);//可以使用这种方式取值 --key指的是键,也就是某个对象中包含的所有的对象,而不是值  
  105.             }  
  106.             //假如我没有firebug,想使用IE实现类似与firebug控制台中console.dir的功能,可以这样  
  107.             for (var key in window) {  
  108.                 // 这样就能将window对象中,包含的全部对象迭代显示出来。也就实现了firebug中console.dir的功能  
  109.                 //document.getElementById("key").innerHTML += (key + ":" + window[key] + "</br>");  
  110.             }  
  111.   
  112.             //对象的删除(释放内存-- 在extjs组件中常用)  
  113.             //            delete b3.v; //删除b3对象中的v成员  
  114.             //            alert(b3.v); // undefined --因为v这个成员已经被删除了  
  115.   
  116.             //类的修改,扩展(重点,难点)  
  117.             //1.假如我要实现一个简单的加法计算  
  118.             //       var numOne = 5;//如果直接这么定义,那么下面的numOne.add(8);执行会报错  
  119.             //如果我这么写,下面调用就不会报错了(因为此时的numOne,是个类.相当于java或C#语言中原始的基本数据类型、包装类型)  
  120.             var numOne = new Number(5);  
  121.             numOne.add = function (numTwo) {  
  122.                 return this + numTwo;  
  123.             }  
  124.             //alert(numOne.add); //undefined  
  125.             // alert(numOne.add(8));//这样写看起来没错,但是会报错--numOne.add is not a function  
  126.             var numThree = new Number(100);  
  127.             //如果我现在想要给numThree对象中也加上add这么一个函数  
  128.             //直接使用prototype这个特殊的属性来实现,给所有的Number类型实例都加入add函数  
  129.             Number.prototype.add = function (numTwo) {  
  130.                 return this + numTwo;  
  131.             }  
  132.   
  133.             alert(numThree.add(200).add(300)); //弹出600   100+200+300=600    
  134.             //说明所有的Number类型确实都具有了add这么一个函数   超级延时绑定--类的扩展  
  135.   
  136.             //小例子 --扩展String类,给所有的String类加上sayILoveYou  
  137.             //            String.prototype.sayILoveYou = function () {  
  138.             //                alert(this.toString() + ", I Love You");  
  139.             //            }  
  140.             //            var strOne = "dinglang";  
  141.             //            strOne.sayILoveYou();  
  142.   
  143.             //javascript中的类的用法  
  144.             //使用构造函数的方式,定义简单的Person类(javascript函数也是一个类)  
  145.             function Person(name) {  
  146.   
  147.                 this.name = name;  
  148.                 this.age = 20;  
  149.                 var year = 2010; //定义一个私有的成员sex  
  150.                 //                this.sayHello = function () {  
  151.                 //                    alert(this.name + ":今年" + this.age + "岁,HelloWold");  
  152.                 //可以直接在这里面定义sayHello成员函数(特权方法),但是每次实例化该类的时候都会重新去定义,所有还是选择用prototype属性的方式  
  153.                 //如果在sayHello函数中要使用year这个私有对象,就可以直接在此定义这个特权方法。这就是典型的“闭包”。  
  154.             }  
  155.             //如果使用了new关键字,说明Person就是一个类。否则的话,只是一个普通的函数  
  156.             var p1 = new Person("丁浪"); // new 一个Person类的实例   
  157.             var p2 = new Person("蔡世友"); //注意:别按照java或者C#的习惯,写成了Person p =new Person("XXX");   
  158.             //给Person这个自定义的类,添加一个sayHello函数  
  159.             Person.prototype.sayHello = function () {  
  160.                 alert(this.name + ":今年" + this.age + "岁,HelloWold");  
  161.             }  
  162.             p1.sayHello();  
  163.             p2.sayHello();  
  164.   
  165.             //实现javascript中的继承  
  166.   
  167.             function classA(name) {  
  168.                 this.name = name;  
  169.                 this.showName = function () {  
  170.                     alert(this.name);  
  171.                 }  
  172.             }  
  173.             function classB(name) {  
  174.                 //1)使用newMethod的方式实现继承  
  175.                 //                this.newMethod = classA;  
  176.                 //                this.newMethod(name);  
  177.                 //                delete this.newMethod; //释放对象  
  178.                 //2)调用claasA这个函数,并把他的上下文(作用域)指向this(也就是classB类的实例)  
  179.                 //这样也能实现继承效果(使用call或者apply)  
  180.                 classA.call(this, name);  
  181.                 //classA.apply(this,[name]);  
  182.             }  
  183.             objA = new classA("操作系统");  
  184.             objB = new classB("组成原理");  
  185.             objA.showName(); //弹出“操作系统”  
  186.             objB.showName(); //弹出“组成原理”  
  187.   
  188.         })  
  189.     </script>  
  190. </head>  
  191. <body>  
  192. <div id="key"> </div>  
  193. </body>  
  194. </html>