最近在开发一个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执行结果
按钮2执行结果
神奇的地方出现了,两个时间竟然一致!!!!!!!!!!
也就是说在JS的class定义中使用了new关键字初始化属性对象,其只初始化一次,其是在class的prototype定义阶段执行的。当一个类的class prototype定义完毕以后,使用new 关键字再次初始化这个对象的时候,并不会将prototype再次初始化,也就是说这里有点类似Java中的 private static property的用法。如果避免JS这样的问题,那么则将类对象值的初始化放到初始化方法里去,确保能正常执行。
不知道这样理解是否正确权且记下,或者那个高人有这方面的原理性资料,也请不吝赐教!
相关推荐
解决Vue2.0动态绑定图片src属性值初始化时报错的问题 标题:解决Vue2.0动态绑定图片src属性值初始化时报错的问题 本文将讨论 Vue 2.0 中动态绑定图片 src 属性值初始化时出现的错误问题,并提供解决方案。 描述:...
- **初始化检查**:在创建DateTimeField实例时,确保`value`属性设置为一个有效的日期时间对象,并且格式化字符串(`format`属性)与期望的显示格式相符。 - **事件监听**:添加`select`事件监听器,当用户做出选择...
在标题"JS组件系列之使用HTML标签的data属性初始化JS组件"中,提到的关键知识点是: 1. **HTML的`data-*`属性**:这是一种HTML5引入的新特性,允许开发者在元素上存储自定义的数据,其名称由"data-"前缀和任意字符...
总结来说,当需要在Vue组件中通过props初始化data时,如果props值是动态的,最好使用`computed`属性或者`watch`来确保数据的同步。这是因为props传递给子组件的基本类型值不会自动响应父组件的变化。理解这一点对于...
这种效果通过JavaScript和jQuery可以轻松实现,而这个插件则专门解决了这个问题,尤其是提供了初始化赋值的功能,使得在页面加载时就可以显示已选的省市地区。 插件的实现原理通常是利用jQuery的选择器和事件监听来...
今天我们将探讨如何使用JavaScript来获取form表单中name属性的值,并且着重讲解在动态表单的情况下,当无法预先确定标签的name属性值时,如何即时获取这些值以便进行存储或处理。 在文章中首先提到的方法是使用...
在使用 KindEditor 实现在线编辑的初始化工作时,我们需要理解并掌握一些关键的参数设置。 1. **idTEXTAREA**:这是初始化编辑器时最重要的参数,它定义了与 KindEditor 关联的文本区域(textarea)的 ID。确保这个...
在JavaScript中,变量初始化是一个重要的概念,指的是在变量被使用之前为其赋予一个初始值。JavaScript 是一种弱类型语言,意味着变量在声明时不一定要指定数据类型,而且在使用时也不需要初始化。然而,不进行初始...
在深入探究Vue.js框架的源码时,状态初始化是一个核心部分,它涉及Vue实例创建时的属性、数据变量和方法的初始处理。这部分内容特别重要,因为Vue的状态管理机制是响应式的,而初始化流程为这一机制打下了基础。接...
JSP页面中的JavaScript脚本初始化表格 #### 函数`doOnLoad()`的作用: 该函数主要负责在页面加载完成后执行一系列初始化操作,包括获取表单数据、设置表格属性等。 #### 关键步骤: - **获取表单值**:通过`...
在使用layui框架构建前端页面时,经常会遇到动态加载数据的问题,特别是涉及到列表的初始化和CheckBox属性的使用。layui是一款优秀的前端UI框架,提供了丰富的组件和API,使得开发者能够快速构建美观且功能强大的...
首先,我们需要理解为什么会出现“Vuex数据异步造成初始化时没值报错”这个问题。通常,当我们尝试从Vuex store获取数据来渲染组件时,如果这些数据尚未从API请求中返回,Vue组件可能就已经进行了初次渲染。这会导致...
一、绑定初始化,自动加载 通过绑定来进行angular的初始化,会把js代码...也就是说,ng-app是可以带属性值的。 <body ng-app=myApp> {{ hello }} [removed] var myModule = angular.module(myApp,[]);
标题中的“不用一句js代码初始化组件”指的是在前端开发中,尝试避免在JavaScript中编写大量初始化组件的代码,特别是对于一些简单的组件,如Bootstrap的Select标签。描述中提到的问题是,当需要从后端获取数据并...
本文将详细探讨如何实现一个年日历,包括维护工作日和休息日,以及初始化法定节假日,主要涉及的技术栈是Vue.js,一个流行的前端JavaScript框架。 首先,我们需要理解年日历的基本构成。年日历通常会展示一年中的12...
以上三种方法都可以有效地解决让`div`滚动条初始化到最低位置的问题。每种方法都有其适用场景: - **点击事件模拟滚动**:适用于需要模拟用户行为的场景。 - **`scrollIntoView`方法**:适用于现代浏览器环境,代码...
这是jQuery中最为常见的初始化页面元素的方法。 6. window.parent属性: window.parent属性在iframe中使用,指的是创建iframe页面的窗口对象。在主页面中,window对象和window.parent是同一个对象,但在嵌入的...
综合以上几点,我们可以通过正确地管理Vue实例中的数据和合理安排JavaScript代码的执行顺序来避免无法对未定义的值、空值或基元值设置反应属性的错误。这样不仅可以解决当前遇到的问题,而且能够提升我们使用Vue框架...
4. **初始化功能**:当页面加载时,Koo.js可以自动设置表单元素的初始状态,如预选值、禁用状态等,简化了开发者的工作。 三、使用步骤 1. **引入库文件**:首先,将Koo.js库文件(通常为koo.js或koo.min.js)引入...
初始化块(包括实例初始化块和静态初始化块)则在类加载或实例化时执行,用来初始化类的静态变量或对象的成员变量。 总的来说,理解Java对象的创建、句柄的概念以及引用的工作方式,对于编写高效、健壮的Java代码至...