我一直在观看精彩的Crockford on JavaScript视频,并且他认为使用new
运算符和<some object>.prototype
可能令人困惑,因此他提出了一个替代方案(如所见) here大约在1:00:40标记处):
function gizmo(id) {
return {
id: id,
toString: function () {
return "gizmo " + this.id;
}
};
}
function hoozit(id) {
var that = gizmo(id);
that.test = function (testid) {
return testid === this.id;
};
return that;
}
人们确实可以说这看起来更干净,只需分别调用gizmo()
或hoozit()
即可实例 gizmo 和 hoozit 。但是,基于我对嵌套函数如何工作的理解,如果我在某个时刻有1000个hoozit实例,我会有toString
的1000个“副本”和test
的1000个“副本”而不是如果将这些函数分别添加到 gizmo 和 hoozit 的原型中,则只需要其中一个。
Crockford提供这样一个良好实践的例子似乎很不寻常,所以我想知道这里是否有我遗漏的东西(例如一些隐藏的JS优化)或者这只是一个代价是提高代码质量的情况性能
编辑:由于 melpomene 在评论中指出这些嵌套函数是否是闭包可能很重要,请考虑以下超级方法示例(同一视频,{ {3}},略微简化):
function hoozit(id) {
var that = gizmo(id);
var super_toString = that.toString;
that.test = function (testid) {
return testid === this.id;
};
that.toString = function () {
return super_toString.apply(that);
};
return that;
}
在这种情况下,内部函数实际上会关闭that
和super_toString
,所以我认为存在一些优化的可能性较小。