`
rainytimes
  • 浏览: 7368 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关JS类的属性值初始化问题

阅读更多

最近在开发一个JS功能的时候犯了一个错误,主要是没有理解JS属性的声明问题。想当然的认为JS的写法和Java是一致的呵呵,查了一周才找到原因,下面先来看段Java代码的示例:

import java.util.Date;

class A{

    private Date createDate = new Date();

    private String name;

    public A(String name){

       this.name = name;

    }

    public void print(){

          System.out.println(name+"==="+createDate .getTime());

    }

}

这里我们的测试代码为:

 

public static void main(String[] args){

    A a1 = new  A("测试1");

        a1.print();

        try {
		Thread.sleep(5000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
        
       
        A a2 = new  A("测试2");

        a2.print();

}

 

我们运行的输出结果分别为:

测试1===1379430542493
测试2===1379430547494

 

 

可以看到时间是不一致的,这个正常

 

 

下面看段JS的代码

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8">
		  <script type="text/javascript">
				var ClassA = function(option){
					this.init(option);
				}
				
				ClassA.prototype = {
					name : '',
					createDate : new Date(),
					init : function(option){
						this.name = option.name;
					}
				
				}
				
				function test1(){
					 
					var a1 = new ClassA({
						name : '测试1'
					});
					
					alert(a1.name+" == "+  a1.createDate.getTime());
					 
				
				}
				
				function test2(){
					 
					var a2 = new ClassA({
						name : '测试2'
					});
					
					alert(a2.name+" == "+  a2.createDate.getTime());
					 
				
				}
				 
		  </script>
	</head>
	<body>
			<input type="button" value="测试1" onclick="test1()"   >
			<input type="button" value="测试2" onclick="test2()"   >
	</body>

</html>

 

 我们分别执行 测试1按钮和测试2按钮,按照一般逻辑,期alert语句打印的信息和时间应该是不一致的,但是实际上是:按钮1执行结果

 

 按钮1执行结果

 

按钮2执行结果

 

按钮2执行结果

 

神奇的地方出现了,两个时间竟然一致!!!!!!!!!!

也就是说在JS的class定义中使用了new关键字初始化属性对象,其只初始化一次,其是在class的prototype定义阶段执行的。当一个类的class prototype定义完毕以后,使用new 关键字再次初始化这个对象的时候,并不会将prototype再次初始化,也就是说这里有点类似Java中的 private static property的用法。如果避免JS这样的问题,那么则将类对象值的初始化放到初始化方法里去,确保能正常执行。

 

不知道这样理解是否正确权且记下,或者那个高人有这方面的原理性资料,也请不吝赐教!

 

 

 

 

 

  • 大小: 10.9 KB
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    解决vue2.0动态绑定图片src属性值初始化时报错的问题

    解决Vue2.0动态绑定图片src属性值初始化时报错的问题 标题:解决Vue2.0动态绑定图片src属性值初始化时报错的问题 本文将讨论 Vue 2.0 中动态绑定图片 src 属性值初始化时出现的错误问题,并提供解决方案。 描述:...

    Extjs扩展DateTimeField时间初始化及点击日期显示Bug

    - **初始化检查**:在创建DateTimeField实例时,确保`value`属性设置为一个有效的日期时间对象,并且格式化字符串(`format`属性)与期望的显示格式相符。 - **事件监听**:添加`select`事件监听器,当用户做出选择...

    JS组件系列之使用HTML标签的data属性初始化JS组件

    在标题"JS组件系列之使用HTML标签的data属性初始化JS组件"中,提到的关键知识点是: 1. **HTML的`data-*`属性**:这是一种HTML5引入的新特性,允许开发者在元素上存储自定义的数据,其名称由"data-"前缀和任意字符...

    Vue中用props给data赋初始值遇到的问题解决

    总结来说,当需要在Vue组件中通过props初始化data时,如果props值是动态的,最好使用`computed`属性或者`watch`来确保数据的同步。这是因为props传递给子组件的基本类型值不会自动响应父组件的变化。理解这一点对于...

    可初始化值的jQuery省市三级联动插件

    这种效果通过JavaScript和jQuery可以轻松实现,而这个插件则专门解决了这个问题,尤其是提供了初始化赋值的功能,使得在页面加载时就可以显示已选的省市地区。 插件的实现原理通常是利用jQuery的选择器和事件监听来...

    js获取form表单中name属性的值

    今天我们将探讨如何使用JavaScript来获取form表单中name属性的值,并且着重讲解在动态表单的情况下,当无法预先确定标签的name属性值时,如何即时获取这些值以便进行存储或处理。 在文章中首先提到的方法是使用...

    kindeditor初始化

    在使用 KindEditor 实现在线编辑的初始化工作时,我们需要理解并掌握一些关键的参数设置。 1. **idTEXTAREA**:这是初始化编辑器时最重要的参数,它定义了与 KindEditor 关联的文本区域(textarea)的 ID。确保这个...

    浅谈js中变量初始化

    在JavaScript中,变量初始化是一个重要的概念,指的是在变量被使用之前为其赋予一个初始值。JavaScript 是一种弱类型语言,意味着变量在声明时不一定要指定数据类型,而且在使用时也不需要初始化。然而,不进行初始...

    Vue源码探究之状态初始化

    在深入探究Vue.js框架的源码时,状态初始化是一个核心部分,它涉及Vue实例创建时的属性、数据变量和方法的初始处理。这部分内容特别重要,因为Vue的状态管理机制是响应式的,而初始化流程为这一机制打下了基础。接...

    JSP页面表格初始化

    JSP页面中的JavaScript脚本初始化表格 #### 函数`doOnLoad()`的作用: 该函数主要负责在页面加载完成后执行一系列初始化操作,包括获取表单数据、设置表格属性等。 #### 关键步骤: - **获取表单值**:通过`...

    对layui初始化列表的CheckBox属性详解

    在使用layui框架构建前端页面时,经常会遇到动态加载数据的问题,特别是涉及到列表的初始化和CheckBox属性的使用。layui是一款优秀的前端UI框架,提供了丰富的组件和API,使得开发者能够快速构建美观且功能强大的...

    解决vuex数据异步造成初始化的时候没值报错问题

    首先,我们需要理解为什么会出现“Vuex数据异步造成初始化时没值报错”这个问题。通常,当我们尝试从Vuex store获取数据来渲染组件时,如果这些数据尚未从API请求中返回,Vue组件可能就已经进行了初次渲染。这会导致...

    Angular.js基础学习之初始化

    一、绑定初始化,自动加载 通过绑定来进行angular的初始化,会把js代码...也就是说,ng-app是可以带属性值的。 &lt;body ng-app=myApp&gt; {{ hello }} [removed] var myModule = angular.module(myApp,[]);

    不用一句js代码初始化组件

    标题中的“不用一句js代码初始化组件”指的是在前端开发中,尝试避免在JavaScript中编写大量初始化组件的代码,特别是对于一些简单的组件,如Bootstrap的Select标签。描述中提到的问题是,当需要从后端获取数据并...

    年日历实现,维护工作日和休息日,初始化法定节假日

    本文将详细探讨如何实现一个年日历,包括维护工作日和休息日,以及初始化法定节假日,主要涉及的技术栈是Vue.js,一个流行的前端JavaScript框架。 首先,我们需要理解年日历的基本构成。年日历通常会展示一年中的12...

    让div滚动条初始化到最低位置的三种方法

    以上三种方法都可以有效地解决让`div`滚动条初始化到最低位置的问题。每种方法都有其适用场景: - **点击事件模拟滚动**:适用于需要模拟用户行为的场景。 - **`scrollIntoView`方法**:适用于现代浏览器环境,代码...

    jquery得到iframe src属性值的方法

    这是jQuery中最为常见的初始化页面元素的方法。 6. window.parent属性: window.parent属性在iframe中使用,指的是创建iframe页面的窗口对象。在主页面中,window对象和window.parent是同一个对象,但在嵌入的...

    vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题

    综合以上几点,我们可以通过正确地管理Vue实例中的数据和合理安排JavaScript代码的执行顺序来避免无法对未定义的值、空值或基元值设置反应属性的错误。这样不仅可以解决当前遇到的问题,而且能够提升我们使用Vue框架...

    Koo.js-标签式表单验证及初始化插件及演示支持select,checkbox,radio.zip

    4. **初始化功能**:当页面加载时,Koo.js可以自动设置表单元素的初始状态,如预选值、禁用状态等,简化了开发者的工作。 三、使用步骤 1. **引入库文件**:首先,将Koo.js库文件(通常为koo.js或koo.min.js)引入...

    Java对象的创建与初始化.docx

    初始化块(包括实例初始化块和静态初始化块)则在类加载或实例化时执行,用来初始化类的静态变量或对象的成员变量。 总的来说,理解Java对象的创建、句柄的概念以及引用的工作方式,对于编写高效、健壮的Java代码至...

Global site tag (gtag.js) - Google Analytics