继续上一章的案例讲解:
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("小龙哥","男"); //调用工厂模式创建对象p1 16 var p2 = createPreason("小龙女","女"); //调用工厂模式创建对象p2 17 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("小龙哥","男"); //调用工厂模式创建对象p1 15 var p2 =new createPreason("小龙女","女"); //调用工厂模式创建对象p2 16 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 this; } 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(); //执行到这一步打印出:objec 16 ** /
好了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添加一个方法sum 3 var result = 0 //求和 4 var i = 0; //一个小的性能优化 不用每次for循环的时候都声明并初始化一个变量 i = 0 5 for(i = 0; i<this.length; i++){ //this 代表调用函数的对象为arr1 6 result+= this[i]; 7 } 8 return result; 9 } 10 alert(arr1.sum()); //80
要是我有很多个这样的数组要求和呢?
我们只是给arr1添加了一个求和的方法其他的数组没有这个方法,所以不能求其他的数组和(有人说还不如使用一个函数呢---恩,有道理。)
接下来就是该网上,书上...广泛流程的原型登场了。