不要将 Array、Object 等类型指定给 prototype
在 JavaScript 中,注意不要将 Array、Object 等类型指定给 prototype,除非您的应用需要那么做。先观察如下代码:
{
}
Foo.prototype.n = 123;
Foo.prototype.date = { year:2009, month:6, day:25 };
var f1 = new Foo();
var f2 = new Foo();
f1.n = 456;
f1.date.day = 24;
alert(f2.n); // 结果为 123
alert(f2.date.day);
f2.date.day 结果是多少?25?错,应该是 24。
这是由于 Array、Object 等与数字、字符串等基本的类型在内存中存储方式不同:
items 存储的并不是数组的内容,数组的内容存的另一个地方,而 items 变量只是存储这个数组的内存地址。
所以 Foo.prototype.date = { year:2009, month:6, day:25 }; 这句实际上已经指定了该 Object 的内存,证据。
f1、f2 的 date 的内存位置不同,但其内存中指向的都是同一个 Object(date) 的内存,所以造成了上述的答案。
要让每个实例的 date 不同,可以这么解决:
{
}
Foo.prototype.date = null;
Foo.prototype.ini = function ()
{
this.date = { year:2009, month:6, day:25 };
}
var f1 = new Foo();
f1.ini();
var f2 = new Foo();
f2.ini();
f1.date.day = 24;
alert(f2.date.day); // 结果为 25
或者直接放在“构造函数”中:
{
this.date = { year:2009, month:6, day:25 };
}
Foo.prototype.date = null;
var f1 = new Foo();
var f2 = new Foo();
f1.date.day = 24;
alert(f2.date.day); // 结果为 25
当然,这两种解决办法中,实际上都可以将 Foo.prototype.date = null; 去掉,因为在为 this.date 赋值时,如果 this.date 不存在,会创建,相当于只要第一次使用 this.date 就创建了这个属性。
只不过加上 Foo.prototype.date = null; 可以在一些编辑器中自动感知 Foo 的属性,方便编程罢了。(更新:Visual Web Developer 2008 SP1 已经能够感知 this. 的东西,所以也可以去掉 Foo.prototype.date = null)
转自:http://www.cftea.com/c/2009/06/M4NFQTP1UY7A3FCE.asp
不要将 Array、Object 等类型指定给 prototype的更多相关文章
- java Object转换成指定的类型
java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
- OpenGL.Vertex Array Object (VAO).
OpenGL抛弃glEnable(),glColor(),glVertex(),glEnable()这一套流程的函数和管线以后,就需要一种新的方法来传递数据到Graphics Card来渲染几何体,我 ...
- c# 将object尝试转为指定对象
主方法: /// <summary> /// 将object尝试转为指定对象 /// </summary> /// <param name="data" ...
- MongoDB之Array Object的特殊操作
相比关系型数据库,Array[1,2,3,4,5]和Object{'name':'Wjs'}是MongoDB比较特殊的类型 db.Wjs.insert({"name":" ...
- MongoDB 之 Array Object 的特殊操作 MongoDB - 6
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
- OpenGL.Vertex Array Object (VAO) [转]
http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...
- 6,MongoDB 之 Array Object 的特殊操作
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
- OpenGL.Vertex Array Object (VAO) 【转】
http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...
随机推荐
- 图片与文字在div里实现垂直水平都居中
第一种方法,利用盒布局实现 <style type="text/css">/*盒布局实现图片与文字水平垂直居中*/ .div1{ width: 100%; heig ...
- 利用CSS3选择器定制checkbox和radio
之前在一个项目中需要定制checkbox,于是乎用图片模拟了一下,之后发现个更好用的方法(*因为兼容问题 在移动开发中用用就好) 效果: 1 2 3 4 5 6 7 实现代码: <style t ...
- [Python] 应用kNN算法预测豆瓣电影用户的性别
应用kNN算法预测豆瓣电影用户的性别 摘要 本文认为不同性别的人偏好的电影类型会有所不同,因此进行了此实验.利用较为活跃的274位豆瓣用户最近观看的100部电影,对其类型进行统计,以得到的37种电影类 ...
- 转:JavaScript函数式编程(三)
转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...
- Qt新建线程的方法(四种办法,很详细,有截图)
看了不少Qt线程的东西,下面总结一下Qt新建一个线程的方法. 一.继承QThread 继承QThread,这应该是最常用的方法了.我们可以通过重写虚函数void QThread::run ()实现我们 ...
- 进程占用百分百CPU不卡(从未试过,当别的程序运行的时候,当前程序还会运行吗?)
在写程序中.为了让程序效率高.有时会点用很高的CPU.这里用户体验不好可以设置线程的优先级来搞定. BOOL SetThreadPriority( HANDLE hThread, // handle ...
- linux中ctrl+z、ctrl+d和ctrl+c的区别
ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...
- ostream类的公有成员函数
1 flush 2 operator<< 3 put 4 seekp 5 tellp 6 write 1 flush 刷新输出流 2 operator<< 插入运算符 3 pu ...
- 浅谈css盒模型
在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素 ...
- javascript第十一课,string对象
length: //字符串长度,索引从0开始 var str='说东方闪电方式的'; alert(str.length); charAt(index); var n='阿斯顿发生打算'; n.cha ...