你的位置:首页 > Java教程

[Java教程]js对象3


继续上一章的案例讲解:

 1 <script type="text/javascript"> 2   function createPreason(name,sex){  //他的怪癖,喜欢参数 3      var person= new Object();  //创建一个对象 4      person.name = name; //给对象添加一个name属性 5      person.sex = sex; //给对象添加一个sex属性 6      person.sayName= function(){ 7       alert("大家好我是:"+this.name);  // 打印出:传进来的参数name的真正值      这里的this代表调用该方法的对象 8      } 9      person.saySex= function(){10       alert("性别:"+this.sex);  // 打印出:传进来的参数sex的真正值      这里的this代表调用该方法的对象11      }12     return person;  //返回对象13   }14 15   var p1 = createPreason("小龙哥","男");  //调用工厂模式创建对象p116   var p2 = createPreason("小龙女","女");  //调用工厂模式创建对象p217   p1.sayName(); //打印出 大家好我是:小龙哥18   p1.saySex();  //打印出 性别:男19   p2.sayName(); //打印出 大家好我是:小龙女20   p2.saySex();  //打印出 性别:女21 </script>

我们说到 js的关键字this代表的是--》调用该函数的对象(通俗易懂的一句话:当前的函数属于谁)

这个说法没毛病:四海皆知嘛。

但是有一点不知:

一:函数前面有new的时候

 1 <script type="text/javascript"> 2   function createPreason(name,sex){  //他的怪癖,喜欢参数 3      this.name = name; //给对象添加一个name属性 4      this.sex = sex; //给对象添加一个sex属性 5      this.sayName= function(){ 6       alert("大家好我是:"+this.name);  // 打印出:传进来的参数name的真正值      这里的this代表调用该方法的对象 7      } 8      this.saySex= function(){ 9       alert("性别:"+this.sex);  // 打印出:传进来的参数sex的真正值      这里的this代表调用该方法的对象10      }11 12   }13 14   var p1 =new createPreason("小龙哥","男");  //调用工厂模式创建对象p115   var p2 =new createPreason("小龙女","女");  //调用工厂模式创建对象p216   p1.sayName(); //打印出 大家好我是:小龙哥17   p1.saySex();  //打印出 性别:男18   p2.sayName(); //打印出 大家好我是:小龙女19   p2.saySex();  //打印出 性别:女20 </script>

这次的改进:函数createPreason()前面有new。函数内部的调整

  1.去掉了函数里面的对象创建

  2.去掉了return 返回

  3.对象的调用换成了this

为什么这样改进呢?改进后的js内部如何执行的呢?

<script type="text/javascript">  function createPreason(name,sex){  //他的怪癖,喜欢参数     //假象系统内部自动构造出一个对象,这个对象赋值给了this     //var this = new Object();     this.name = name; //给对象添加一个name属性     this.sex = sex; //给对象添加一个sex属性     this.sayName= function(){      alert("大家好我是:"+this.name);  // 打印出:传进来的参数name的真正值      这里的this代表调用该方法的对象     }     this.saySex= function(){      alert("性别:"+this.sex);  // 打印出:传进来的参数sex的真正值      这里的this代表调用该方法的对象     }      //假象系统内部自动返回了     // return person;    }  var p1 = new createPreason("小龙哥","男");  //调用工厂模式创建对象p1  var p2 =new createPreason("小龙女","女");  //调用工厂模式创建对象p2  p1.sayName(); //打印出 大家好我是:小龙哥  p1.saySex();  //打印出 性别:男  p2.sayName(); //打印出 大家好我是:小龙女  p2.saySex();  //打印出 性别:女</script>

假象系统给我们函数内部添加了对象与return返回,我们只需要在里面添加想要的数据就行了。

一个总结:1.函数外面加new,里面不加new。相反:函数外面不加new,里面加new.

     2.函数前面加new,系统会自动在函数的内部新创建一个对象赋值给this

再举一个例子加深印象:

 1 function show (){ 2  alert(this);   3 } 4 show();  //执行到这一步打印出:window  (全局函数默认属于window, window.show() ) 5  6 new show() //执行到这一步打印出:object 7  8   /** 9      function show(){10       //假象系统内部执行流程11       var this = new Object();12       alert(this)13     }14 15     new show(); //执行到这一步打印出:objec16   ** /

好了this与new讲的差不多了,继续看下面

2.解决浪费--引出原型

  还好现在的电脑内存大,够用,所以浪费的起那是任性,但是做程序必须做到能省则省的原则

案例求一个数组的和:

1 var arr1 = new Array(22,44,1,6,7);  //也可以使用直接量创建  var arr1 = [22,44,1,6,7];2   arr1.sum = function(){  //给数组arr1添加一个方法sum3     var result = 0 //求和4     var i = 0;  //一个小的性能优化 不用每次for循环的时候都声明并初始化一个变量 i = 05     for(i = 0; i<this.length; i++){  //this 代表调用函数的对象为arr16       result+= this[i];7     }8     return result;9   }10   alert(arr1.sum());  //80

要是我有很多个这样的数组要求和呢?

我们只是给arr1添加了一个求和的方法其他的数组没有这个方法,所以不能求其他的数组和(有人说还不如使用一个函数呢---恩,有道理。)

接下来就是该网上,书上...广泛流程的原型登场了。