本系列作为EffectiveJavaScript的读书笔记。

一个类型的prototype和该类型的实例之间是”一对多“的关系。那么,须要确保实例相关的数据不会被错误地保存在prototype之上。

比方,对于一个实现了树结构的类型而言,将它的子节点保存在该类型的prototype上就是不对的:

function Tree(x) {
this.value = x;
}
Tree.prototype = {
children: [], // should be instance state!
addChild: function(x) {
this.children.push(x);
}
}; var left = new Tree(2);
left.addChild(1);
left.addChild(3); var right = new Tree(6);
right.addChild(5);
right.addChild(7); var top = new Tree(4);
top.addChild(left);
top.addChild(right); top.children; // [1, 3, 5, 7, left, right]

当状态被保存到了prototype上时。全部实例的状态都会被集中地保存,在上面这样的场景中显然是不对的:本来属于每一个实例的状态被错误地共享了。例如以下图所看到的:

正确的实现应该是这种:

function Tree(x) {
this.value = x;
this.children = []; // instance state
}
Tree.prototype = {
addChild: function(x) {
this.children.push(x);
}
};

此时,实例状态的存储例如以下所看到的:

可见。当本属于实例的状态被共享到prototype上时,或许会产生问题。在须要在prototype上保存状态属性前。一定要确保该属性是可以被共享的。

整体而言,当一个属性是不可变(无状态)的属性时,就能将它保存在prototype对象上(比方方法可以被保存在prototype对象上就是由于这一点)。当然,有状态的属性也可以被放在prototype对象上,这要取决于详细的应用场景,典型的比方用来记录一个类型实例数量的变量。

使用Java语言作为类比的话,这类可以存储在prototype对象上的变量就是Java中的类变量(使用statickeyword修饰)。

总结:

  1. 当在prototype对象上存放可变数据时,可能会带来问题。

  2. 普通情况下,每一个实例特有的可变属性须要被存放在实例本身上。

最新文章

  1. 深入学习jQuery元素尺寸和位置操作
  2. SpringSide 部署showcase项目出现 JAX-RS (REST Web Services) 2.0 can not be installed错误!
  3. Java设计模式之代理模式
  4. 仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同
  5. chaper3_exerise_UVa455_周期串
  6. Allegro建立引脚封装概念名词梳理
  7. CSS中的相对定位和绝对定位
  8. Config The Image URL Solution
  9. 宏定义#define和typedef的区别和典型范例题目辨析
  10. 我都使用了这些VS插件
  11. 关于VS2012下安装破解文件Visual Assit X的一点说明
  12. JAVA类型信息——Class对象
  13. hdu 4672 Present Day, Present Time 博弈论
  14. Java架构必会几大技术点(转)
  15. HDU 1432 Lining Up (POJ 1118)
  16. HAProxy安装文档
  17. InnoDB一棵B+树可以存放多少行数据?
  18. IDEA下调试和运行Hadoop程序例子
  19. E - Coin Game
  20. 一个更好的C++序列化/反序列化库Kapok

热门文章

  1. 安装Logstash
  2. 全国计算机等级考试二级教程-C语言程序设计_第11章_对函数的进一步讨论
  3. wx.Notebook
  4. RNTools
  5. mysql中使用正则表达式时的注意事项
  6. IT人员----怎么把电脑窗口设置成淡绿色
  7. 图片处理之-Bitmap.Config,jpeg压缩与大小
  8. MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:NO)
  9. Python核心编程读笔 6: 映射和集合类型
  10. 解决SVN:could not start external diff program的问题。