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. HDU-2502-月之数

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2502 分析: 比如n=4时,有: 1000 1001 1010 1011 1100 1101 1110 ...

  2. iOS 登陆之使用ShareSDK

    0. 概述 登陆要使用ShareSDK,可以实现多社交平台账号登陆,短信验证,并且都是永久免费的. 网址:www.mob.com 1.iOS 登陆之界面设置

  3. 使用DatePickerDialog、TimePickerDialog

    DatePickerDialog与TimerPicker的功能比较简单,用户也简单,只要如下两步即可. ①通过new关键字创建DatePickerDialog.TimePickerDialog实例,调 ...

  4. Iframe 自适应高度并实时监控高度变化的js代码

    不得不用到iframe,且被强烈要求不能让它出现滚动条!嵌入的页面肯定是高度不一的,页面中也不能出现大片空白,所以也不能写死高度!真是麻鬼烦啊!google N次 + 百度M次 + 试验了1605次之 ...

  5. HDU-1256-画8

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1256 这题做的我好苦,开始题目理解错了,一直都不对,仔细看题,别急,慢慢来,别紧张, 难度到不大,但题 ...

  6. C# App.config配置文件的讲解

    App.config是C#开发WinForm程序的配置文件,开发Web程序的配置文件叫Web.config.本文介绍App.config的简介使用. 我们先来打开一个App.config文件,看看它的 ...

  7. Spring util-namespace下标签相关操作

    java代码 package com.stono.sprtest; import java.util.List; import java.util.Map; import java.util.Set; ...

  8. 统计SQLSERVER表行数,以及每天数据变化的行数

    此sql对监控系统很有帮助,知道哪些表压力大,每天的数量级大概多少等信息. 得到这些信息就可以做相应的策略来进行系统优化. create table tmp( name varchar(50), ro ...

  9. 关于多字节字符入库失败处理(所谓的Emji),该处理是舍弃特殊字符

    具体处理方法及样例如下: /** * 屏蔽超过三个字节以上的字符 * @param strByte * @return */ public static String filterUtf8(byte[ ...

  10. ubuntu 16.04 的64位 安装arm-none-linux-gnueabi-gcc的步骤和问题解决

    一 首先下载arm-none-linux-gnueabi-gcc交叉编译器,根据不同的需求请在网址: https://launchpad.net/gcc-arm-embedded/+download ...