Effective JavaScript Item 34 在prototype上保存方法

页面导航:首页 > 网络编程 > JavaScript > Effective JavaScript Item 34 在prototype上保存方法

Effective JavaScript Item 34 在prototype上保存方法

来源: 作者: 时间:2016-02-20 09:49 【

本系列作为EffectiveJavaScript的读书笔记。 不使用prototype进行JavaScript的编码是完全可行的,例如:function User(name, passwordHash) {this name = name;this passwordHash = passwordHash

本系列作为EffectiveJavaScript的笔记。

不使用prototype进行JavaScript的编码是完全可行的,例如:


function User(name, passwordHash) {
	this.name = name;
	this.passwordHash = passwordHash;
	this.toString = function() {
		return "[User " + this.name + "]";
	};
	this.checkPassword = function(password) {
		return hash(password) === this.passwordHash;
	};
}

var u1 = new User(/* ... */);
var u2 = new User(/* ... */);
var u3 = new User(/* ... */);

当创建了多个User类型的实例时,就存在问题了:不仅是name和passwordHash属性在每个实例上都存在,toString和checkPassword方法在每个实例上都有一份拷贝。就像下图表示的那样:


\


但是,当toString和checkPasswZ喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmSxu7ao0uXU2nByb3RvdHlwZcnPyrGjrMnPzby+zbHks8nPwsPm1eK49tH519PBy6O6PC9wPgo8YnI+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20141009/20141009082135223.png" alt="\">


toString和checkPassword方法现在定义在了User.prototype对象上,也就意味着这两个方法只存在一份拷贝,并被所有的User实例共享。

也许你会认为将方法作为拷贝放在每个实例上,会节省方法查询的时间。(当方法定义在prototype上时,首先会在实例本身上寻找方法,如果没有找到才会去prototype上继续找)

但是在现代的Script执行引擎中,对方法的查询进行了大量优化,所以这个查询时间几乎是不需要考虑的,那么将方法放在prototype对象上就节省了很多内存。

总结:

  1. 将方法存放在实例上会导致每个实例都会拥有该方法的一份拷贝,导致内存的浪费。
  2. 优先将方法存放在prototype对象上。
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<