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

转自:  http://www.cnblogs.com/mengdd/p/3697255.html

  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();

解析: 一定要用this.getInfo = function() 这种方法来定义方法,否则person.getInfo();将无法调用person里定义好的方法。

  改进版:加上参数:

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>

(六)javascriptJS中定义对象的几种方式(转)的更多相关文章

  1. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  2. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  3. JavaScript中定义对象的四种方式

    最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...

  4. js中定义对象的几种方式

    转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html (1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个. va ...

  5. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  6. PHP中定义常量的几种方式与区别

    [问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  7. javascript中定义事件的三种方式

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...

  8. js中定义变量的三种方式const,val,let 的区别

    js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始 ...

  9. javascript中定义事件的三种方式 分类: C1_HTML/JS/JQUERY 2014-08-07 10:27 634人阅读 评论(0) 收藏

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...

随机推荐

  1. 001.MVC基本概述

    MVC的基本概念 一.NET平台下开发web应用程序的方案(方法) 方案A:ASP.NET webForm1.web窗体:臃肿(胖)性能低 优点:有很多的web控件可以使用,能够方便的和服务端交互(数 ...

  2. ML2 配置 OVS VxLAN - 每天5分钟玩转 OpenStack(146)

    今天我们开始学习 OVS 如何实现 Neutron VxLAN,关于 VxLAN 的概念以及 Linux Bridge 实现,大家可以参考前面相关章节. Open vSwitch 支持 VXLAN 和 ...

  3. [html5] 学习笔记-编辑 API 之 Range 对象(一)

    1.Range对象的基本概念 一个Range对象代表页面上的一段连续区域,通过Range对象,可以获取或修改网页上的任何区域. <!DOCTYPE html> <html> & ...

  4. ThreadLocal模式的原理

    在JDK的早期版本中,提供了一种解决多线程并发问题的方案:java.lang.ThreadLocal类.ThreadLocal类在维护变量时,实际使用了当前线程(Thread)中的一个叫做Thread ...

  5. IOS控件布局之Masonry布局框架

    前言: 回想起2013年做iOS开发的时候,那时候并没有采用手写布局代码的方式,而是采用xib文件来编写,如果使用纯代码方式是基于window的size(320,480)计算出一个相对位置进行布局,那 ...

  6. WebAppBuilder自定义主题

    WebAppBuilder自定义主题 by 李远祥 基本步骤: 创建新主题的文件夹 注册新的主题到manifest.json 文件 覆盖HeaderController 部件的颜色. 覆盖panel的 ...

  7. HUST 1584 摆放餐桌

    1584 - 摆放餐桌 时间限制:1秒 内存限制:128兆 609 次提交 114 次通过 题目描述 BG准备在家办一个圣诞晚宴,他用一张大桌子招待来访的客人.这张桌子是一个圆形的,半径为R.BG邀请 ...

  8. 微信公众号开发总结(Node.js + express + winston)

    关于订阅号.服务号.企业号 官方定位 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式. 服务号:主要偏于服务交互(类似银 ...

  9. vue实现图书管理demo

    年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...

  10. [Kafka] - Kafka内核理解:Message

    一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成 ...