Javascript--this指针

<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <script>
            var name = "The Window";   //相当于 window.name = "The Window";
            
            /****************字面量创建对象**************/

            var object1 = {   
              name : "My Object1",   
              getNameFunc : function(){   
                return function(){   
                  return this.name;   
                 };   
              }   
            };   
            
            function showThis1(){
               alert(object1.getNameFunc()());  //The Window
            }

            var object2 = {   
              name : "My Object2", 
                //方法
              getNameFunc : function(){ 
                    //方法内的this指针指向调用方法的对象,所以that引用了正确的对象object2
                    var that = this;
                    //函数
                return function(){   
                  return that.name;   
                 };   
              }   
            };  

            function showThis2(){
               alert(object2.getNameFunc()());  //My Object2
            }

            /***************字面量创建对象**************/


            /***************工厂模式创建对象,利用函数返回一个对象***********/
            /*工厂模式创建对象,可利用内部函数形成闭包,创建较为复杂的对象*/

            var object3 = (function(){
                function getName(){
                   return this.name;
                }

                return {
                    name : "My Object3",
                    //这种写法与Object1是同一种情况
                    getNameFunc : function(){
                       return getName(); 
                  }
                }
            })();

            function showThis3(){
               alert(object3.getNameFunc());  //Window
            }

            

            var object4 = (function(){
                return {
                    name : "My Object4",
                    getNameFunc : function(){
                       return this.name; 
                  }
                }
            })();

            function showThis4(){
               alert(object4.getNameFunc());  //My Object4
            }            

            var object5 = (function(){
                
                //函数内的this 默认指向window,这里的that依然指向window而不是object5
                var that = this;

                function getName(){
                   return that.name;
                }

                return {
                    name : "My Object5",
                    getNameFunc : function(){
                        return getName();
                  }
                }
            })();

            function showThis5(){
               alert(object5.getNameFunc());  //Window
            }
            /***************工厂模式创建对象**************/

            
            /***************构造方法创建对象**************/
            /*构造方法比较特殊,其this指针指向待返回的对象,
而不是window,注意构造方法的函数首字母一定要大写
*/ function Object6(){ this.name = "My Object6"; this.getNameFunc = function(){ return this.name; } } var object6 = new Object6(); function showThis6(){ alert(object6.getNameFunc()); //My Object6 } function Object7(){ //但是构造函数内部定义的函数this指针仍然指向window,依然需要注意 function getName(){ return this.name; } this.name = "My Object7"; this.getNameFunc = function(){ return getName(); } } var object7 = new Object7(); function showThis7(){ alert(object7.getNameFunc()); //Window } /***************构造方法创建对象**************/ /*使用上述方式创建对象均有一个缺陷,
就是每一个object实例均有不同的getNameFunc,而不是共享为一个, 浪费了内存空间,使用原型模式创建对象可以解决这个问题
*/ /*******原型模式创建对象*********/ function Object8(){ } //相当于Java中被共享的属性 public static String name; Object8.prototype.name = "My Object8"; //相当于Java类中的函数 public String getNameFunc(){...}; Object8.prototype.getNameFunc = function (){ return this.name; } var object8 = new Object8(); /*这样,每一个利用构造函数Object8创建出来的对象,均共享了getNameFunc节约了内存空间。 但是由于原型对象是被所有子对象所共享的,所以子对象同时共享了name属性, 若某一个对象修改了name属性的值,其它对象的name会同时改变,这显然是不希望看到的*/ var object8_bro = new Object8(); function showThis8(){ alert(' object8: ' + object8.getNameFunc()
+ ' object8兄弟: ' + object8_bro.getNameFunc()); alert('object8兄弟改名了!'); object8_bro.name = 'Object8魔改'; alert(' object8: ' + object8.getNameFunc()
+ ' object8兄弟: ' + object8_bro.getNameFunc()
+ ' WTF,两兄弟同时改名了!'); } /*******原型模式创建对象*********/ /********组合使用原型模式和构造函数创建对象**************/ /*为了解决这个问题,可组合使用原型模式和构造函数创建对象,
即公共方法写在原型对象中 ,私有变量写在构造方法中 。 这也是许多jQuery插件之中经常使用的创建对象的方式
*/ function Object9(){ this.name = "Object9" } Object9.prototype.getNameFunc = function(){ return this.name; } var object9 = new Object9(); var object9_bro = new Object9(); function showThis9(){ alert(' object9: ' + object9.getNameFunc()
+ ' object9兄弟: ' + object9_bro.getNameFunc()); alert('object9兄弟改名了!'); object9_bro.name = 'Object9魔改'; alert(' object9: ' + object9.getNameFunc()
+ ' object9兄弟: ' + object9_bro.getNameFunc() + ' 该是谁还是谁!'); } /********组合使用原型模式和构造函数创建对象**************/ //稍稍改动下,像不像一个jQuery插件,像不像一个java的类呢 var jQuery = {}; ;(function($){ //构造函数 function Object10(){ //私有变量 this.name = "Object10" } //公有函数 Object10.prototype.getNameFunc = function(){ return _getName(this); } $.createObject10 = function(){ return new Object10(); } //闭包私有函数 function _getName(that){ //注意this指针!! return that.name.toUpperCase(); } })(jQuery); var object10 = jQuery.createObject10(); function showThis10(){ alert(object10.getNameFunc()); } </script> </head> <body> <button onclick = "showThis1()"> this1 </button> <button onclick = "showThis2()"> this2 </button> <button onclick = "showThis3()"> this3 </button> <button onclick = "showThis4()"> this4 </button> <button onclick = "showThis5()"> this5 </button> <button onclick = "showThis6()"> this6 </button> <button onclick = "showThis7()"> this7 </button> <button onclick = "showThis8()"> this8 </button> <button onclick = "showThis9()"> this9 </button> <button onclick = "showThis10()"> this10 </button> </body> <html>
原文地址:https://www.cnblogs.com/Jeb-Sun/p/6807600.html