javascript对象中创建新对象问题

问题描述

var TestObject = Class.create();TestObject.prototype = { data: new Array(), initialize: function(){ }}var ss = new TestObject();ss.data.push("AAA");alert(ss.data.length);为什么多次执行(总是创建新对象后,向对象data数组里,加入一条数据)var ss = new TestObject();ss.data.push("AAA");alert(ss.data.length);ss.data.length会增加,按理说应该都是1才对吧?问题补充:那怎么样才能不对象共享呢?

解决方案

如果使用TestObject.prototype.data=new Array();给它的data赋值的话.相当于创建了一个全局变量(假设说它的名字为temp),temp=new Array();然后TestObject,prototype.data=temp;因为temp是一个"对象".所以TestObject,prototype.data的值实际上是类似于C语言中的指针,指向了new Array()的地址.所以,当你使用ss.data.push("AAA");之后,实际上是push到了temp这个全局变量中.因为其它的TestObject对象中的data全都是共享了temp这个变量.所以只要修改其中一个,其它的都会受影响.但如果用一个普通的值类型变量,如一个数字123,或一个字符串"test",不管怎么修改都不会出错了.建议楼主在不要随便让prototype中的属性指向一个"对象"类型的数据.因为这样的话,会造成这个属性变为全局共享.任何地方的修改都会影响到另一个地方的值.如果一定要用的话.可以在声明类的时候用:function TestObject={ this.dataa=new Array()}这样,由于作用域的关系,你每次创建TestObject这个类的实例时,都会新建一个Array对象,不会上上面一样,共享同一个Array的对象.
解决方案二:
prototype对象里面的方法和对象其实是各个实例化对象共享的,所以其实都改变了data的值

时间: 2024-09-08 13:06:50

javascript对象中创建新对象问题的相关文章

在JavaScript中创建新对象

使用JavaScript可以创建自己的对象.虽然JavaScript内部和浏览器本身的功能已十分强大,但JavaScript还是提供了创建一个新对象的方法.使其不必像超文本标识语言那样,求于或其它多媒体工具,就能完成许多复杂的工作. 在JavaScript中创建一个新的对象是十分简单的.首先它必须定义一个对象,而后再为该对象创建一个实例.这个实例就是一个新对象,它具有对象定义中的基本特征. 一.对象的定义 JavaScript对象的定义,其基本格式如下: Function Object(属性表)

在 JavaScript 中创建 JSON 对象

<html> <body> <h2>在 JavaScript 中创建 JSON 对象</h2> <p> Name: <span id="jname"></span><br /> Age: <span id="jage"></span><br /> Address: <span id="jstreet">&

handler-Android。在无限循环的线程中创建Message对象,无限出现GC调用。

问题描述 Android.在无限循环的线程中创建Message对象,无限出现GC调用. 我在Android开发中.开启了一个线程,这个线程是无限循环的.并且在这个线程里,我通过创建Handle的Message对象,然后handler.sendMessage(msg).可是这样一来,LOGCat上就一直出现GC_CONCURRENT.请问我该怎么修改代码,或者用哪种方式才能即实现功能,又能减少GC的调用.具体代码如下://线程private class getData_thread extends

使用Transact-SQL在SQL Server中创建数据库对象

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   Adventure Works Cycles 的数据仓库中有几个非常大的表.为改善此数据的存储,您决定对几个跨文件组的表进行分区.这样您就可以控制基础磁盘存储. 先决条件 在开始此实验之前,您必须: 使用 Transact-SQL 在 Microsoft® SQL Server® 数据库中创建数据库对象的经验. 实验设置 实验场景 Adventure Works

在Eclipse中创建新的重构功能

创建 对重构的强大支持是软件开发人员喜爱Eclipse的一个最为重要的原因.而Eclipse还有一个至少和重构不相上下的优点,那就是其近乎无懈可击的可扩展性.这两者的结合意味着我们可以根据自己的需要来创建展新的重构功能. 介绍 重构在现代软件开发过程中扮演着重要的角色,它能够减轻软件开发人员的工作负担,提高软件开发的生产效率.为了阐明重构的重要性,我们在这里引用了developerWorks上David Carew提供的关于重构的教程中的一段话: 现在,一个开发者的工作大部分在于对现有的代码进行

ios-iOS中 @synchronized(对象) 中&amp;amp;quot;对象&amp;amp;quot;是什么的问题

问题描述 iOS中 @synchronized(对象) 中"对象"是什么的问题 @synchronized(对象)中的这个"对象"是什么,锁定它是为了什么 在 sellTicket 中锁定了 self , 如果在 ticket 中没有用@synchronized(self),就会在sellTicket中线程运行的情况下,运行ticket中的线程, 如果用了@synchronized(self) 所有线程就会一个一个运行 //============== 代码部分 =

web开发-myEclipse中创建新的web project会在工程名上报错

问题描述 myEclipse中创建新的web project会在工程名上报错 开发-myEclipse中创建新的web project会在工程名上报错-myeclipse webproject"> 如图所示,只有在项目名称的上面会有一个错误表示.但是程序可以正常运行. 如果不管这个会不会有什么问题? 解决方案 有错误提示就是有错误了,如果找不到的话,我个人认为是JDK的问题,看你那里是用[myelcipse7.1]的JRE,可以改为jdk6,具体操作:右击JRE System librar

操作系统-谁能简要讲解一下UNIX和windows中创建新进程的方式

问题描述 谁能简要讲解一下UNIX和windows中创建新进程的方式 在教材上看到 不太明白 解决方案 http://blog.chinaunix.net/uid-25436678-id-3076217.html 解决方案二: unix是fork,Windows上是createprocess/ createprocessasuser/ createprocesswithtokenw等

Javascript 中创建自定义对象的方法汇总_javascript技巧

Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. 复制代码 代码如下:      var student = new Object();      student.name = "xiao ming";      student.age = 20;      student.getName = function () {          ale