首页 > 代码库 > Effective JavaScript Item 36 实例状态只保存在实例对象上
Effective JavaScript Item 36 实例状态只保存在实例对象上
本系列作为EffectiveJavaScript的读书笔记。
一个类型的prototype和该类型的实例之间是”一对多“的关系。那么,需要确保实例相关的数据不会被错误地保存在prototype之上。比如,对于一个实现了树结构的类型而言,将它的子节点保存在该类型的prototype上就是不正确的:
function Tree(x) { this.value = http://www.mamicode.com/x;>当状态被保存到了prototype上时,所有实例的状态都会被集中地保存,在上面这种场景中显然是不正确的:本来属于每个实例的状态被错误地共享了。如下图所示:
正确的实现应该是这样的:
function Tree(x) { this.value = http://www.mamicode.com/x;>此时,实例状态的存储如下所示:
可见,当本属于实例的状态被共享到prototype上时,也许会产生问题。在需要在prototype上保存状态属性前,一定要确保该属性是能够被共享的。
总体而言,当一个属性是不可变(无状态)的属性时,就能将它保存在prototype对象上(比如方法能够被保存在prototype对象上就是因为这一点)。当然,有状态的属性也能够被放在prototype对象上,这要取决于具体的应用场景,典型的比如用来记录一个类型实例数量的变量。使用Java语言作为类比的话,这类能够存储在prototype对象上的变量就是Java中的类变量(使用static关键字修饰)。
总结:
- 当在prototype对象上存放可变数据时,可能会带来问题。
- 一般情况下,每个实例特有的可变属性需要被存放在实例本身上。
Effective JavaScript Item 36 实例状态只保存在实例对象上
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。