web.js.创建对象

来源:互联网 发布:mac u盘 没有退出选项 编辑:程序博客网 时间:2024/06/07 02:12

对象的组成
方法——函数:动态,过程:
属性——变量:状态,静态:

变量:自由,不属于任何东西:
属性:属于一个对象

函数,变量属于某个对象时就成为方法,属性(其实本质还是一样,环境不同名字不同而已)看下面一段代码

            var arr=[1,2,3];//变量            arr.a=12;//属性            show=function (){//函数                alert(this);            }            arr.yinshuo=function (){//方法                alert(this);            }            show();//window            arr.yinshuo();//1,2,3

看下面一段代码,创建了一个自己的对象

  <script type="text/javascript">  function creatpeo(name,qq){//构造函数,    var obj=new Object();//创建对象        obj.name=name;        obj.qq=qq;//name qq 为属性        obj.myname=function(){        alert('我的名字:'+this.name)        }        obj.myqq=function(){        alert('我的QQ:'+this.qq);        }   //以上两个为方法        return obj;  }     var obj1=creatpeo('尹烁','12315');//调用    var obj2=creatpeo('尹航','110');        obj1.myname();//尹烁        obj1.myqq();    //12315        alert(obj1.myname)//他们俩弹出都是obj.myname=function(){        alert(obj2.myname)//alert('我的名字:'+this.name)                                            //}        alert(obj1.myname==obj2.myname)//但答案却是false,想想这样会引发什么样的坏处  </script>

咱们 一步步解决上面的问题 ,首先通常咱们调用一个类前 要加new,
比如 var arr=new Array(),在这里 new有什么用呢,先看修改后的代码

 function creatpeo(name,qq){//构造函数,    //加了new后 系统偷偷为你做了类似 var this=new Object()        this.name=name;        this.qq=qq;        this.myname=function(){        alert('我的名字:'+this.name)        }        this.myqq=function(){        alert('我的QQ:'+this.qq);        }           //系统偷偷为你 return this    ;     }     var  en= new creatpeo('尹烁','12315');         en.myname();         en.myqq();        </script>

代码得到简化,咱看下一个问题,alert(obj1.myname==obj2.myname)
答案为false
在上面我已经做了实验,obj1.myname与obj2.myname弹出的东西完全相等,但却系统却认为不一样,这就造成了空间大量浪费(因为每调用一次,就要多拿出一部分空间来储存它),怎么解决呢,看下面

            function creatpoeple(name,qq){                this.name=name;                this.qq=qq;            }            creatpoeple.prototype.Sname=function(){                alert('我的名字:'+this.name);            }            creatpoeple.prototype.Sqq=function(){                alert('我的名字:'+this.qq);            }        var obj1= new creatpoeple('尹烁','12315')        var obj2= new creatpoeple('尹航','110')                   obj1.Sname();            obj1.Sqq();            alert(obj1.Sname==obj2.Sname);//ture

这里我们用到了prototype(原型),什么是原型呢,看一段简单的代码

var arr1=new Array(12,55,34);var arr2=new Array(12,33, 1);arr1.sum=function ()                {    var result=0;    for(var i=0;i<this.length;i++)    {        result+=this[i];    }    return result;};alert(arr1.sum());alert(arr2.sum());

思考下,alert(arr2.sum());能弹出来吗,有什么方法才能弹出来呢,
就是再加一个arr2的方法即

arr2.sum=function ()                {    var result=0;    for(var i=0;i<this.length;i++)    {        result+=this[i];    }    return result;};

是不是感觉特别麻烦,在看看prototype(原型)如何解决这个问题

var arr1=new Array(12,55,34);var arr2=new Array(12,33, 1);Array.prototype.sum=function () {    var result=0;    for(var i=0;i<this.length;i++)    {        result+=this[i];    }    return result;};alert(arr1.sum());alert(arr2.sum());  

依我来看,原型就是把本质相同一些东西集合到一起,Array.prototype是一个集合[arr1,arr2],当你调用arr1.sum(),Array.prototype.sum=function (),也就可以理解为arr1.sum=function (),接着上面的代码

    function creatpoeple(name,qq){//构造函数                this.name=name;                this.qq=qq;            }            creatpoeple.prototype.Sname=function(){//方法                alert('我的名字:'+this.name);            }            creatpoeple.prototype.Sqq=function(){//方法                alert('我的名字:'+this.qq);            }        var obj1= new creatpoeple('尹烁','12315')        var obj2= new creatpoeple('尹航','110')                   obj1.Sname();            obj1.Sqq();            alert(obj1.Sname==obj2.Sname);//ture

依据上面所说,你是不是可以对这段代码进行分析呢,同样很惊喜的看到,我们最后得到的是true
1.咱们先对前面没说的进行解释
构造函数 : 加属性 不同的(name,qq不同的特征)
原型 : 加方法 相同的(让不同的对象(arr1,arr2)使用相同的方法)

继续努力

0 0