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

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

  • 相关阅读:
    物理机和虚拟机互相可以ping通,还是无法连接
    CentOS 7: ping Name or service not known
    Ubuntu上安装搜狗输入法(sogou)
    成功安装 tesserocr
    The following untracked working tree files would be overwritten by merge
    切换本地凭据(Windows上登录的GitHub账号)
    配置了SSH后还是每次都要求输入密码
    dpkg dependency problems prevent configuration
    mui 设置应用全屏模式
    解决烦人的缓存问题!
  • 原文地址:https://www.cnblogs.com/andyhxl/p/6067999.html
Copyright © 2011-2022 走看看