javascript的面向对象 函数 闭包 构造函数 继承

时间:2022-12-17 19:27:59
 <script>
        //------------函数的创建方式------------  function f1() {
            alert('我是一个兵');
        }

        var a = function () {
            alert("我是两个兵");
        }

        f1();
        a();           //其实也可以这样写(a)();   (function () {                 //这个其实就是有a演变过来的 后面括号表示立即执行 可以存放参数 为了后面闭包  alert("我是三个兵");
        })();

        (function (p) {
            alert(p);
        })(123);

        //-------------arguments对象-----------------  function arg(a,b,c) {
            //在函数执行时有个arguments对象,保存所有的参数  //arguments对象,类似数组,可以用下标访问,并且有length属性 // alert(arguments);  alert(arguments[3]);
            alert(arguments.length);
            alert(a+"\n"+b+"\n"+c);
        }
        arg(1,2,3,4);


        //--------------闭包------------------------------------------  //闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量  var g = "全局变量!!!";                   //这里讲的还是函数的嵌套使用  function fnA() {
            var a = "A";
            //alert(g);  fnB();        //注意这里还是要执行的  function fnB() {
                var b = "B";
                alert(g);    //全局变量,在任何函数的任何位置都可以访问得到  alert(a);    //可以访问到a  alert(c);    //但不可以访问c  function fnC() {
                    var c = "C";
                    alert(a+"\n"+b);     //只要遵循从里向外看的原则 看到的变量都可以访问到最终值  }                         //在函数声明处向函数外部看到的声明的所有变量,在 函数内部都能访问到他们的最终值  fnC();
            }
        }

        //fnB() 在这里是不能访问到的 因为函数换种方式写就是变量了 这个函数就相当于局部变量 外面是访问不到的 上面提示也有把锁 表示访问不到   //-----------闭包详解-----------------  function outer() {
            var a = 1212,b = 1234;
            function inner() {
                return a;
            }
            inner.function_closure= {a:1212,b:1234};          //这边是自定义的 其实是不存在的  return inner;              //这里的返回值为函数类型 要想使用就必须调用()  }
        var inner = outer();
        alert(inner());


        function each() {
            var i = 0,innner,a = [];
            for(; i<10;i++){
                cache(i);            //如果直接把函数cache放在这里面的话 就只能访问到i的最终值10  // 这样写的话就可以访问到全部的变量了 闭包的一部分  }

            function cache(i) {
                a.push(function () {
                    alert(i);
                })
            }
        }

        //--------------构造函数------------------  function Demo(name,age) {
            this.name = name;       //这里的this很关键  this.age = age;
// return [123,456]; //这是错误的 因为构造函数不能有返回值 他  }
        var d = new Demo("cj",18);
        alert(d.name);
        alert(d.age);

        var c = Demo("VJ",19);            //不用new的时候 this指向的是window对象  alert(widows.name+"\n"+window.age);



        //-------------继承------------------  //------------这里是无参数继承--------------  function DemoA() {
            this.name = "CJ";
        }
        function DemoB() {  //要让DemoB继承DemoA  //构造函数A的prototype属性是一个对象  //这个对象具有的所有属性,A的实例也具有   }
        DemoB.prototype = new DemoA;     //new DemoA 就相当于返回 {name:CJ}对象  // 这句代码一定要在下句代码的前面 不然就会出错 变成undefined  //这里千万不能写为new DemoA(),更加不能传参数 在特殊情况下可以 但是只能执行一次 也就是说只会实例一次  //就是只会传递参数给第一个DemoB 后面如果创建新的DemoB对象是不传递参数的  var d = new DemoB();
        alert(d.name);

        //---------------这里是有参数继承---------------  function DemoA(name,age) {
            this.name = name;
            this.age = age;
        }
        function DemoB(name,age) {  //要让DemoB继承DemoA  /*this.DemoA = DemoA;  this.DeemoA(name,age);*/  DemoA.call(this,name,age);     //简写的方式 就是为了可以参数继承  }
        DemoB.prototype = new DemoA;
        var d = new DemoB("cj",18);
        alert(d.name);

        var d2 = new DemoB("dghk",19);
        alert(d2.name);

        //------这里是为引出call的例子------  function fn(a,b) {
            this.ver = 123;
        }
        var o = {};
        fn.apply(o,[12,"b"])    //功能一样 只不过这里的参数是以数组传递的  fn.call(o,12,"b");        //call函数的一个方法,call(第一个参数为this指向的对象,。。。函数的参数)  //其实call的作用就是改变函数内this的指针  alert(o.ver);
    </script>