您的位置:首页 > Web前端 > JavaScript

javascript中定义对象的方法

2013-12-02 22:51 183 查看
javascript是一种面向对象的方法,但是却又没有类的概念。javascript中的对象是由一组成员变量组成的集合(有点奇怪,其实function也是一种引用变量)。在javascript中,主要有下面集中定义对象的方法:

一、使用Object定义新的对象

二、使用工厂方法创建新的对象

三、使用构造方法创建新的对象

四、使用原型方法(prototype)创建新的对象

每一种方法都是对上一种方法的改进,解决原来方法中出现的问题。下面就对每一种方法的定义语法和其中的缺陷逐一说明

一、使用Object定义新的对象,定义的语法如下:

        var o=new Object();

        o.prop1="11";

        o.method=function(){...}

例子如下:

<script type="text/javascript">

 var blog=new Object();

  blog.name="javascript小憩站";

  blog.text="";

  blog.add=function(var text){ this.text=text}

</script>

使用这种方法定义对象比较简单,容易理解。但是假设,有一个人需要定义很多类似blog的对象,那么上面的代码就需要重复很多遍。可以想象,随着时间的推移,当定义的对象多到一定程度,整个程序会庞大到一个什么程度?于是就出现了使用工厂方法来创建类似的对象。

二、使用工厂方法创建新的对象

使用工厂方法创建类似的对象,因为创建的对象包含类似的属性和方法,我们可以通过把这些属性的值和方法作为一个函数的参数,在函数中创建新的对象,并将参数的值赋给相应的成员变量,如下面的例子

<script type="text/javascript">

 function createBlog(var name,var text){

   var blog=new Object();

   blog.name=name;

   blog.text=text;

 }

 var blog1=createBlog("name","javascript");

</script>

上面把创建对象的方法封装到了一个函数中,只是把其中可变的部分提炼成了参数,这样比起上面那种方式好了很多。但是又一个问题来了,创建的对象没有自己的身份,如果我们使用instanceof来检查创建的对象,发现所有的都是object类型,这个如果程序简单的时候,可能只是有一点不方便,但是问题还不是很大。但是如果我们需要封装一个新的通用的类型,让别人调用,如Tree,Text,Form等,这个就是一个很大的问题了。于是使用构造方法创建对象的方式就出现了。

三、使用构造方法创建新的对象

在面向对象的语言中,构造方法的第一个字母都是需要大写,这是一种约定,但是不是一种语法上的规定。使用构造函数创建对象,首先我们需要定义一个构造方法,由于javascript中没有一个类的概念,所以我们定义的构造方式其实就是一个函数,如下面的例子:

<script type="text/javascript">

 function Blog(var name,var text){

   this.name=name;

   this.text=text;

 }

 var blog1=new Blog("name","javascript");

</script>

使用构造方法创建新的对象关键在于new关键字,如果不使用new关键字,就是相当于运行这个函数,按照函数运行作用域的概念,相当于直接在window对象中添加的两个成员变量。想要理解构造函数,就需要知道new操作为我们完成了什么内容。首先,new操作先创建一个新的对象(这里不是Object),并将这个对象作为整个操作的作用域(相当于this就是新建的这个对象),执行构造函数中的操作,所有操作完成后,返回这个对象,整个创建过程完成。

构造参数的方式不但解决了代码封装的问题,还解决的身份识别的问题,如果我们再使用instanceof操作就会发现,blog1不但是Object的实例,还是Blog对象的实例。到这里已经相当的完美了,但是如果我们在对象中定义函数,就会发现,每一个对象都会保留函数的副本。在对象中定义的函数,处理的逻辑操作的对象除了传入的参数之外,就是这个对象的成员变量,也就是说,函数只需要定义一次(保留一个副本)就可以了,于是原型模式出现了。

四、使用原型方法(prototype)创建新的对象

使用原型对象就是将对象的处理逻辑共享,让同一个类型的对象共享一组处理逻辑。如我们创建的对象Blog,都会有方法write,check,save,edit等方法,使用原型创建Blog对象的语法如下:

<script type="text/javascript">

 function Blog(var name,var text){

   this.name=name;

   this.text=text;

 }

Blog.prototype.write=function(var text){...};

Blog.prototype.edit=function(var text){...}

 </script>

上面的例子先声明一个构造函数,并在构造函数的基础上使用原型prototype添加方法,这样就是实现了方法的共享。如果想深入的理解原型,请参考相关的书籍。原型是javascript这一门语言中最核心,最灵活,但也是最难理解的概念之一。

 

还有一种声明对象的方法,比较常用,直接使用字面量的方式,如下:

var blog={name:"dddd",text:"text",write:function(var ddd){}};

使用这种方式声明对象简单明了,是我们比较常用的声明对象的方法,尤其是在传递比较复杂的参数的时候(可能都觉得有点眼熟,这不就是json格式的数据吗?是的)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: