zoukankan      html  css  js  c++  java
  • Javascript创建类和对象

    现总结一下Javascript创建类和对象的几种方法:

    1、原始的创建方法:

    1 <script type="text/javascript">
    2     var person = new Object();
    3     person.name="Amy";
    4     person.sex="Woman";
    5     person.show=function(){
    6         document.write("name is: "+this.name+" ; sex is:"+this.sex);
    7     }
    8     person.show(); 
    9 </script>
    View Code

    原始的创建方法对于熟悉面向对象的人来说难以接受,总感觉属性和方法的封装不是很紧密,这种封装是以“对象名”+“.”的方式进行,表示对象名后跟的属性和方法是这个对象拥有的东西,这个对象(例如:person)就是封装好的结果,你可以继续追加方法和属性,例如追加age属性:person.age=23;这种创建方法会让熟悉Java编程的人感到很难受。我们可以对原始的创建方法进一步“封装”一下,请看下一步:

    2、工厂方法模式:

     1 <script type="text/javascript">
     2     function personFactory(name,age,sex){
     3         var ob=new Object();
     4         ob.name=name;
     5         ob.age=age;
     6         ob.sex=sex;
     7         ob.show=function(){
     8             document.write(ob.name+" "+ob.age+" "+ob.sex);
     9         }
    10         return ob;
    11     }
    12     var person=personFactory("Amy",21,"Woman");
    13     person.show();
    14 </script>
    View Code

    工厂方法模式看起来更像一个类了,personFactory对原始的创建方法进行了封装,并将创建好的对象返回给person引用变量,person就可以引用这个创建好的对象了,但是还不够完美:你每一次创建一个对象, 并使用该对象调用show()方法时,都会创建新的show()函数,它们完全可以调用同一个show方法,优化方法是将show放到工厂外,如下:

     1 <script type="text/javascript">
     2     function show(){
     3         document.write(this.name+" "+this.age+" "+this.sex);
     4     }
     5     function personFactory(name,age,sex){
     6         var ob=new Object();
     7         ob.name=name;
     8         ob.age=age;
     9         ob.sex=sex;
    10         ob.show=show;
    11         return ob;
    12     }
    13     var person=personFactory("Amy",22,"Woman");
    14     person.show();
    15 </script>
    View Code

    从功能上说,上面的代码解决了函数重用问题,但是呈现方式不像是创建一个对象,熟悉Java的人仍感到难受。请看下一步:

    3、构造方法模式:

     1 <script type="text/javascript">
     2     function person(name,age,sex){
     3         this.name=name;
     4         this.age=age;
     5         this.sex=sex;
     6         this.show=function(){
     7             document.write(this.name+" "+this.age+" "+this.sex);
     8             document.write("<br>");
     9         }
    10     }
    11     var per=new person("Amy",22,"Woman");
    12     per.show();
    13 </script>
    View Code

    上述代码的创建方式已经与Java类和对象的创建方式几乎一样了,封装好类的属性和方法,然后利用new关键字创建并返回一个对象,这不就是Java创建类和对象的过程吗,是的,就是这个过程,但是还可以优化,这种方式创建的对象调用show方法是也会即时地创建一个show函数,我们能不能创建一个所有对象公用的一个方法呢?就像Java类中的static方法一样,所有对象都使用同一个static方法,答案是可以的。请看下一步:

    4、动态原型方法:

     1 <script type="text/javascript">
     2     function Person(name,age,sex){
     3         this.name=name;
     4         this.age=age;
     5         this.sex=sex;
     6         if(typeof Person.tag == "undefined"){
     7             Person.prototype.show=function(){
     8                 document.write(this.name+" "+this.age+" "+this.sex);
     9                 document.write("<br>");
    10             }
    11             Person.tag=true;
    12         }
    13     }
    14     var per=new Person("Peter",22,"Man");
    15     per.show();
    16 </script>
    View Code

    这里使用了一点技巧,当用new创建对象是,会执行Person功能块中的if判断语句,顺序从上往下,刚开始tag变量当然没有定义,所以执行if语句块里的内容:

    Person.prototype.show=function(){
    document.write(this.name+" "+this.age+" "+this.sex);
    document.write("<br>");
    }

    这段内容的含义是创建一个属于类Person的show方法,注意,它是一个类方法,相当于Java中static修饰后的方法,而非单个对象的方法,这样所有的对象均可调用同一个方法了,这样也不用每次不同对象调用方法是都创建自己的show函数了,既节省空间又节省时间,这种方法岂不更妙。这里解释一下,以“类名.prototype.属性/方法”方式构造的属性和方法相当于Java中用static修饰的变量或方法,是属于整个类的,而非单个的对象,也即所有对象是共享的。

    以上是学习JS类和对象的总结,其中个人理解错误之处还望大家批评指正。

  • 相关阅读:
    vim快捷键整理(随时更新)
    值不能为:null 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
    未能从程序集“system.servicemodel,version=3.0.0.0,culture=neutral,publickeytoken=b77a5c561934e089”中加载类型“system.servicemodel.activation.httpmodule”
    linux内存手动释放
    无法获取有关 Windows NT 组/用户 'WIN-***************' 的信息,错误代码 0x534。 [SQLSTATE 42000] (错误 15404)).
    ERROR: child process failed, exited with error number 51
    MongoDB 分片状态recovering
    打不开磁盘“D:vmcentos7.3_3CentOS7.3_3 64 位-000002.vmdk”或它所依赖的某个快照磁盘
    更换内存引发的问题
    AttributeError: 'module' object has no attribute 'random'
  • 原文地址:https://www.cnblogs.com/codeMedita/p/6920314.html
Copyright © 2011-2022 走看看