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("小龙哥","男");   //调用工厂模式创建对象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添加了一个求和的方法其他的数组没有这个方法,所以不能求其他的数组和(有人说还不如使用一个函数呢---恩,有道理。)

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

原文地址:https://www.cnblogs.com/andyhxl/p/6067999.html