JavaScript JS中定义对象的几种方式

转载 2015年07月08日 13:39:55

JavaScript中没有类的概念,只有对象。

  在JavaScript中定义对象可以采用以下几种方式:

  1.基于已有对象扩充其属性和方法

  2.工厂方式

  3.构造函数方式

  4.原型(“prototype”)方式

  5.动态原型方式

 

一.基于已有对象扩充其属性和方法

复制代码
<script type="text/javascript">
var object = new Object();
object.name = "zhangsan";
object.sayName = function(name)
{
       this.name = name;
       alert(this.name);
}
object.sayName("lisi");
</script>
复制代码

  这种方式的弊端:这种对象的可复用性不强,如果需要使用多个对象,还需要重新扩展其属性和方法。

 

二.工厂方式

复制代码
function createObject()
{
       var object = new Object();
       object.username = "zhangsan";
       object.password = "123";

       object.get = function()
       {
              alert(this.username + ", " + this.password);
       }
       return object;
}

var object1 = createObject();
var object2 = createObject();

object1.get();
复制代码

 

改进一:采用带参数的构造方法:

复制代码
function createObject(username, password)
{
       var object = new Object();

       object.username = username;
       object.password = password;

       object.get = function()
       {
              alert(this.username + ", " + this.password);
       }

       return object;
}

var object1 = createObject("zhangsan", "123");

object1.get();
复制代码

 

改进二:让多个对象共享函数对象

  这样,不用每个对象都生成一个函数对象。

复制代码
function get()
{
       alert(this.username + ", " + this.password);
}

//函数对象只有一份
function createObject(username, password)
{
       var object = new Object();

       object.username = username;
       object.password = password;

       object.get = get; //每一个对象的函数对象都指向同一个函数对象

       return object;
}

var object = createObject("zhangsan", "123");
var object2 = createObject("lisi", "456");

object.get();
object2.get();
复制代码

 

  优点:让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。

  缺点:对象和它的方法定义分开了,可能会造成误解和误用。

 

三.构造函数方式

  构造函数的定义方法其实和普通的自定义函数相同。

复制代码
function Person()
{
       //在执行第一行代码前,js引擎会为我们生成一个对象
       this.username = "zhangsan";
       this.password = "123";

       this.getInfo = function()
       {
              alert(this.username + ", " + this.password);
       } 

       //此处有一个隐藏的return语句,用于将之前生成的对象返回
       //只有在后面用new的情况下,才会出现注释所述的这两点情况

}

//生成对象
var person = new Person();//用了new
person.getInfo(); 
复制代码

 

  改进版:加上参数:

复制代码
function Person(username, password)
{
       this.username = username;
       this.password = password;

       this.getInfo = function()
       {
              alert(this.username + ", " + this.password);
       }
}

var person = new Person("zhangsan", "123");
person.getInfo();
复制代码

 

四.原型(“prototype”)方式

  例子:

复制代码
function Person()
{
}

Person.prototype.username = "zhangsan";
Person.prototype.password = "123";

Person.prototype.getInfo = function()
{
       alert(this.username + ", " + this.password);
}

var person = new Person();
var person2 = new Person();

person.username = "lisi";

person.getInfo();
person2.getInfo();
复制代码

 

  使用原型存在的缺点:

  1.不能传参数;

  2.有可能会导致程序错误。

 

  如果使用原型方式来定义对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。

  单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

 

  比如,username改为数组后:

复制代码
function Person()
{
}

Person.prototype.username = new Array();
Person.prototype.password = "123";

Person.prototype.getInfo = function()
{
       alert(this.username + ", " + this.password);
}

var person = new Person();
var person2 = new Person();

person.username.push("zhangsan");
person.username.push("lisi");
person.password = "456";

person.getInfo(); //输出:zhangsan,lisi, 456
person2.getInfo(); //输出:zhangsan,lisi, 123

//虽然没有对person2对象进行修改,但是它的name和person是一样的,即为zhangsan,lisi
复制代码

 

  这是因为使用原型方式,person和person2指向的是同一个原型,即对应了同样的属性对象。

  对于引用类型(比如数组),两个对象指向了同一个引用,所以对一个所做的更改会影响另一个。

  而对于字符串(字面常量值),重新赋值之后就指向了另一个引用,所以二者的修改互不影响。

 

对原型方式的改进:

  使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法

复制代码
<script type="text/javascript">
//使用原型+构造函数方式来定义对象

function Person()
{
       this.username = new Array();
       this.password = "123";
}

Person.prototype.getInfo = function()
{
       alert(this.username + ", " + this.password);
}

var p = new Person();
var p2 = new Person();

p.username.push("zhangsan");
p2.username.push("lisi");

p.getInfo();
p2.getInfo();

</script>
复制代码

 

 

五.动态原型方式

  在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。

复制代码
<script type="text/javascript">

function Person()
{
       this.username = "zhangsan";
       this.password = "123";

       if(typeof Person.flag == "undefined")
       {
              //此块代码应该只在第一次调用的时候执行
              alert("invoked");

              Person.prototype.getInfo = function()
              {
                     //这个方法定义在原型中,会被每一个对象所共同拥有
                     alert(this.username + ", " + this.password);
              }

              Person.flag = true;//第一次定义完之后,之后的对象就不需要再进来这块代码了

       }
}

var p = new Person();
var p2 = new Person();

p.getInfo();
p2.getInfo();

</script>
复制代码

 

参考资料

  圣思园张龙老师Java Web视频教程。

  W3School JavaScript教程:http://www.w3school.com.cn/js/index.asp

  英文版:http://www.w3schools.com/js/default.asp


简要描述 JavaScript 中定义函数的几种方式

JavaScript 中,有三种定义函数的方式: 1、函数语句:即使用 function 关键字显式定义函数。如:function f(x){ return x+1; }2、函数定义表达式:也称为“...
  • u012396955
  • u012396955
  • 2016年12月29日 16:39
  • 216

javaScript定义函数的三种方式

1,正常方法 function print(msg){     document.write(msg); } 对函数进行调用的几种方式:  函数名(传递给函数的参数1,传递给函数的参数2,…...
  • wk843620202
  • wk843620202
  • 2016年10月09日 16:10
  • 643

JavaScript中的对象,如何创建对象,创建对象的7种模式

ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说明对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正...
  • u014346301
  • u014346301
  • 2016年08月14日 16:33
  • 9599

JavaScript基础——面向对象的程序设计(一)创建对象的几种方式总结

简介 面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。前面提到过,ECMAScript中没有类的概念,因...
  • Goskalrie
  • Goskalrie
  • 2016年06月03日 13:09
  • 3463

JavaScript中定义对象的几种方式(JavaScript中没有类的概念,只有对象)

1)基于已有对象扩充其属性和方法 var object = new Object(); object.name = "kyle"; //添加属性name object.sayName = f...
  • silianlinyi
  • silianlinyi
  • 2012年05月28日 20:38
  • 2612

JS创建对象几种不同方法详解

1、工厂模式弊端:没有解决对象的识别问题,即怎么知道一个对象的类型。 2、构造函数模式 与工厂模式相比: 1、没有显式的创建对象 2、直接将属性和方法赋给了this对象 3、没有return...
  • liuyan19891230
  • liuyan19891230
  • 2016年02月29日 14:28
  • 6797

Javascript中的几种继承方式比较

开篇 从’严格’意义上说,javascript并不是一门真正的面向对象语言。这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,...
  • kkkkkxiaofei
  • kkkkkxiaofei
  • 2015年06月12日 17:32
  • 10936

javascript中定义事件的三种方式

在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1、在html中,使用onclick属性 2、在javascript中,使用onclick属性 3、在javascipt...
  • jediael_lu
  • jediael_lu
  • 2014年08月07日 10:27
  • 9711

JavaScript四种函数调用方式

JavaScript四种函数调用方式
  • woaijianjiandandande
  • woaijianjiandandande
  • 2016年10月19日 12:21
  • 1314

js对象的定义方法

(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。          (2)工厂方法 :可以重复返回多个对象。     function createOb...
  • myinc
  • myinc
  • 2014年08月14日 21:55
  • 2009
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaScript JS中定义对象的几种方式
举报原因:
原因补充:

(最多只允许输入30个字)